diff options
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-param.c | 26 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 2 | ||||
-rw-r--r-- | gdb/python/python.c | 29 |
3 files changed, 43 insertions, 14 deletions
diff --git a/gdb/python/py-param.c b/gdb/python/py-param.c index f9dcb07..1dd716b 100644 --- a/gdb/python/py-param.c +++ b/gdb/python/py-param.c @@ -88,6 +88,30 @@ struct parmpy_object const char **enumeration; }; +/* Wraps a setting around an existing parmpy_object. This abstraction + is used to manipulate the value in S->VALUE in a type safe manner using + the setting interface. */ + +static setting +make_setting (parmpy_object *s) +{ + + if (var_type_uses<bool> (s->type)) + return setting (s->type, &s->value.boolval); + else if (var_type_uses<int> (s->type)) + return setting (s->type, &s->value.intval); + else if (var_type_uses<auto_boolean> (s->type)) + return setting (s->type, &s->value.autoboolval); + else if (var_type_uses<unsigned int> (s->type)) + return setting (s->type, &s->value.uintval); + else if (var_type_uses<char *> (s->type)) + return setting (s->type, &s->value.stringval); + else if (var_type_uses<const char *> (s->type)) + return setting (s->type, &s->value.cstringval); + else + gdb_assert_not_reached ("unhandled var type"); +} + extern PyTypeObject parmpy_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("parmpy_object"); @@ -110,7 +134,7 @@ get_attr (PyObject *obj, PyObject *attr_name) { parmpy_object *self = (parmpy_object *) obj; - return gdbpy_parameter_value (self->type, &self->value); + return gdbpy_parameter_value (make_setting (self)); } return PyObject_GenericGetAttr (obj, attr_name); diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 368681b..022d4a6 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -438,7 +438,7 @@ PyObject *gdbpy_create_ptid_object (ptid_t ptid); PyObject *gdbpy_selected_thread (PyObject *self, PyObject *args); PyObject *gdbpy_selected_inferior (PyObject *self, PyObject *args); PyObject *gdbpy_string_to_argv (PyObject *self, PyObject *args); -PyObject *gdbpy_parameter_value (enum var_types type, void *var); +PyObject *gdbpy_parameter_value (const setting &var); gdb::unique_xmalloc_ptr<char> gdbpy_parse_command_name (const char *name, struct cmd_list_element ***base_list, struct cmd_list_element **start_list); diff --git a/gdb/python/python.c b/gdb/python/python.c index 37eacef..a26c373 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -449,9 +449,9 @@ python_command (const char *arg, int from_tty) NULL (and set a Python exception) on error. Helper function for get_parameter. */ PyObject * -gdbpy_parameter_value (enum var_types type, void *var) +gdbpy_parameter_value (const setting &var) { - switch (type) + switch (var.type ()) { case var_string: case var_string_noescape: @@ -459,16 +459,20 @@ gdbpy_parameter_value (enum var_types type, void *var) case var_filename: case var_enum: { - const char *str = *(char **) var; + const char *str; + if (var.type () == var_enum) + str = var.get<const char *> (); + else + str = var.get<char *> (); - if (! str) + if (str == nullptr) str = ""; return host_string_to_python_string (str).release (); } case var_boolean: { - if (* (bool *) var) + if (var.get<bool> ()) Py_RETURN_TRUE; else Py_RETURN_FALSE; @@ -476,7 +480,7 @@ gdbpy_parameter_value (enum var_types type, void *var) case var_auto_boolean: { - enum auto_boolean ab = * (enum auto_boolean *) var; + enum auto_boolean ab = var.get<enum auto_boolean> (); if (ab == AUTO_BOOLEAN_TRUE) Py_RETURN_TRUE; @@ -487,16 +491,16 @@ gdbpy_parameter_value (enum var_types type, void *var) } case var_integer: - if ((* (int *) var) == INT_MAX) + if (var.get<int> () == INT_MAX) Py_RETURN_NONE; /* Fall through. */ case var_zinteger: case var_zuinteger_unlimited: - return gdb_py_object_from_longest (* (int *) var).release (); + return gdb_py_object_from_longest (var.get<int> ()).release (); case var_uinteger: { - unsigned int val = * (unsigned int *) var; + unsigned int val = var.get<unsigned int> (); if (val == UINT_MAX) Py_RETURN_NONE; @@ -505,7 +509,7 @@ gdbpy_parameter_value (enum var_types type, void *var) case var_zuinteger: { - unsigned int val = * (unsigned int *) var; + unsigned int val = var.get<unsigned int> (); return gdb_py_object_from_ulongest (val).release (); } } @@ -542,10 +546,11 @@ gdbpy_parameter (PyObject *self, PyObject *args) return PyErr_Format (PyExc_RuntimeError, _("Could not find parameter `%s'."), arg); - if (! cmd->var) + if (!cmd->var.has_value ()) return PyErr_Format (PyExc_RuntimeError, _("`%s' is not a parameter."), arg); - return gdbpy_parameter_value (cmd->var_type, cmd->var); + + return gdbpy_parameter_value (*cmd->var); } /* Wrapper for target_charset. */ |