X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-type.c;h=e8af6f60e1e5a35db388355b337a12f2136cad44;hb=4acfdd20c9ef3c0368868b4221554f0abef04196;hp=88770fcc9f392923f381a66e0cc9f2cf984dbcfd;hpb=8833fbf05c5b93fb3ccf666d5a3bd0e51e75d1bd;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 88770fcc9f..e8af6f60e1 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -26,9 +26,8 @@ #include "demangle.h" #include "objfiles.h" #include "language.h" -#include "vec.h" +#include "gdbsupport/vec.h" #include "typeprint.h" -#include "py-ref.h" typedef struct pyty_type_object { @@ -165,7 +164,7 @@ typy_get_code (PyObject *self, void *closure) /* Helper function for typy_fields which converts a single field to a gdb.Field object. Returns NULL on error. */ -static PyObject * +static gdbpy_ref<> convert_field (struct type *type, int field) { gdbpy_ref<> result (field_new ()); @@ -199,9 +198,7 @@ convert_field (struct type *type, int field) if (arg == NULL) return NULL; - /* At least python-2.4 had the second parameter non-const. */ - if (PyObject_SetAttrString (result.get (), (char *) attrstring, - arg.get ()) < 0) + if (PyObject_SetAttrString (result.get (), attrstring, arg.get ()) < 0) return NULL; } @@ -218,23 +215,21 @@ convert_field (struct type *type, int field) } } if (arg == NULL) - { - arg.reset (Py_None); - Py_INCREF (arg.get ()); - } + arg = gdbpy_ref<>::new_reference (Py_None); + if (PyObject_SetAttrString (result.get (), "name", arg.get ()) < 0) return NULL; - arg.reset (TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False); - Py_INCREF (arg.get ()); + arg = gdbpy_ref<>::new_reference (TYPE_FIELD_ARTIFICIAL (type, field) + ? Py_True : Py_False); if (PyObject_SetAttrString (result.get (), "artificial", arg.get ()) < 0) return NULL; if (TYPE_CODE (type) == TYPE_CODE_STRUCT) - arg.reset (field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False); + arg = gdbpy_ref<>::new_reference (field < TYPE_N_BASECLASSES (type) + ? Py_True : Py_False); else - arg.reset (Py_False); - Py_INCREF (arg.get ()); + arg = gdbpy_ref<>::new_reference (Py_False); if (PyObject_SetAttrString (result.get (), "is_base_class", arg.get ()) < 0) return NULL; @@ -246,10 +241,7 @@ convert_field (struct type *type, int field) /* A field can have a NULL type in some situations. */ if (TYPE_FIELD_TYPE (type, field) == NULL) - { - arg.reset (Py_None); - Py_INCREF (arg.get ()); - } + arg = gdbpy_ref<>::new_reference (Py_None); else arg.reset (type_to_type_object (TYPE_FIELD_TYPE (type, field))); if (arg == NULL) @@ -257,24 +249,22 @@ convert_field (struct type *type, int field) if (PyObject_SetAttrString (result.get (), "type", arg.get ()) < 0) return NULL; - return result.release (); + return result; } /* Helper function to return the name of a field, as a gdb.Field object. If the field doesn't have a name, None is returned. */ -static PyObject * +static gdbpy_ref<> field_name (struct type *type, int field) { - PyObject *result; + gdbpy_ref<> result; if (TYPE_FIELD_NAME (type, field)) - result = PyString_FromString (TYPE_FIELD_NAME (type, field)); + result.reset (PyString_FromString (TYPE_FIELD_NAME (type, field))); else - { - result = Py_None; - Py_INCREF (result); - } + result = gdbpy_ref<>::new_reference (Py_None); + return result; } @@ -284,7 +274,7 @@ field_name (struct type *type, int field) the field, or a tuple consisting of field name and gdb.Field object. */ -static PyObject * +static gdbpy_ref<> make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind) { switch (kind) @@ -294,7 +284,7 @@ make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind) gdbpy_ref<> key (field_name (type, i)); if (key == NULL) return NULL; - gdbpy_ref<> value (convert_field (type, i)); + gdbpy_ref<> value = convert_field (type, i); if (value == NULL) return NULL; gdbpy_ref<> item (PyTuple_New (2)); @@ -302,7 +292,7 @@ make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind) return NULL; PyTuple_SET_ITEM (item.get (), 0, key.release ()); PyTuple_SET_ITEM (item.get (), 1, value.release ()); - return item.release (); + return item; } case iter_keys: return field_name (type, i); @@ -319,36 +309,31 @@ static PyObject * typy_fields_items (PyObject *self, enum gdbpy_iter_kind kind) { PyObject *py_type = self; - PyObject *result = NULL, *iter = NULL; struct type *type = ((type_object *) py_type)->type; struct type *checked_type = type; - TRY + try { checked_type = check_typedef (checked_type); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH + gdbpy_ref<> type_holder; if (checked_type != type) - py_type = type_to_type_object (checked_type); - iter = typy_make_iter (py_type, kind); - if (checked_type != type) - { - /* Need to wrap this in braces because Py_DECREF isn't wrapped - in a do{}while(0). */ - Py_DECREF (py_type); - } - if (iter != NULL) { - result = PySequence_List (iter); - Py_DECREF (iter); + type_holder.reset (type_to_type_object (checked_type)); + if (type_holder == nullptr) + return nullptr; + py_type = type_holder.get (); } + gdbpy_ref<> iter (typy_make_iter (py_type, kind)); + if (iter == nullptr) + return nullptr; - return result; + return PySequence_List (iter.get ()); } /* Return a sequence of all fields. Each field is a gdb.Field object. */ @@ -375,7 +360,7 @@ typy_fields (PyObject *self, PyObject *args) /* Array type. Handle this as a special case because the common machinery wants struct or union or enum types. Build a list of one entry which is the range for the array. */ - gdbpy_ref<> r (convert_field (type, 0)); + gdbpy_ref<> r = convert_field (type, 0); if (r == NULL) return NULL; @@ -428,21 +413,32 @@ typy_get_tag (PyObject *self, void *closure) return PyString_FromString (tagname); } +/* Return the type's objfile, or None. */ +static PyObject * +typy_get_objfile (PyObject *self, void *closure) +{ + struct type *type = ((type_object *) self)->type; + struct objfile *objfile = TYPE_OBJFILE (type); + + if (objfile == nullptr) + Py_RETURN_NONE; + return objfile_to_objfile_object (objfile).release (); +} + /* Return the type, stripped of typedefs. */ static PyObject * typy_strip_typedefs (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - TRY + try { type = check_typedef (type); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type_to_type_object (type); } @@ -456,15 +452,14 @@ typy_get_composite (struct type *type) for (;;) { - TRY + try { type = check_typedef (type); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH if (TYPE_CODE (type) != TYPE_CODE_PTR && !TYPE_IS_REFERENCE (type)) break; @@ -524,17 +519,16 @@ typy_array_1 (PyObject *self, PyObject *args, int is_vector) return NULL; } - TRY + try { array = lookup_array_range_type (type, n1, n2); if (is_vector) make_vector_type (array); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type_to_type_object (array); } @@ -561,15 +555,14 @@ typy_pointer (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - TRY + try { type = lookup_pointer_type (type); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type_to_type_object (type); } @@ -630,15 +623,14 @@ typy_reference (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - TRY + try { type = lookup_lvalue_reference_type (type); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type_to_type_object (type); } @@ -665,15 +657,14 @@ typy_const (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - TRY + try { type = make_cv_type (1, 0, type, NULL); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type_to_type_object (type); } @@ -684,15 +675,14 @@ typy_volatile (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - TRY + try { type = make_cv_type (0, 1, type, NULL); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type_to_type_object (type); } @@ -703,15 +693,14 @@ typy_unqualified (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - TRY + try { type = make_cv_type (0, 0, type, NULL); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type_to_type_object (type); } @@ -722,14 +711,13 @@ typy_get_sizeof (PyObject *self, void *closure) { struct type *type = ((type_object *) self)->type; - TRY + try { check_typedef (type); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { } - END_CATCH /* Ignore exceptions. */ @@ -743,15 +731,14 @@ typy_get_alignof (PyObject *self, void *closure) struct type *type = ((type_object *) self)->type; ULONGEST align = 0; - TRY + try { align = type_align (type); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { align = 0; } - END_CATCH /* Ignore exceptions. */ @@ -763,7 +750,7 @@ typy_lookup_typename (const char *type_name, const struct block *block) { struct type *type = NULL; - TRY + try { if (startswith (type_name, "struct ")) type = lookup_struct (type_name + 7, NULL); @@ -775,11 +762,10 @@ typy_lookup_typename (const char *type_name, const struct block *block) type = lookup_typename (python_language, python_gdbarch, type_name, block, 0); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return type; } @@ -805,7 +791,7 @@ typy_lookup_type (struct demangle_component *demangled, if (! type) return NULL; - TRY + try { /* If the demangled_type matches with one of the types below, run the corresponding function and save the type @@ -830,11 +816,10 @@ typy_lookup_type (struct demangle_component *demangled, break; } } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH } /* If we have a type from the switch statement above, just return @@ -868,16 +853,15 @@ typy_legacy_template_argument (struct type *type, const struct block *block, return NULL; } - TRY + try { /* Note -- this is not thread-safe. */ info = cp_demangled_name_to_comp (TYPE_NAME (type), &err); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH if (! info) { @@ -948,17 +932,16 @@ typy_template_argument (PyObject *self, PyObject *args) } } - TRY + try { type = check_typedef (type); if (TYPE_IS_REFERENCE (type)) type = check_typedef (TYPE_TARGET_TYPE (type)); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH /* We might not have DW_TAG_template_*, so try to parse the type's name. This is inefficient if we do not have a template type -- @@ -983,15 +966,14 @@ typy_template_argument (PyObject *self, PyObject *args) return NULL; } - TRY + try { val = value_of_variable (sym, block); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return value_to_value_object (val); } @@ -1001,16 +983,15 @@ typy_str (PyObject *self) { string_file thetype; - TRY + try { LA_PRINT_TYPE (type_object_to_type (self), "", &thetype, -1, 0, &type_print_raw_options); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH return PyUnicode_Decode (thetype.c_str (), thetype.size (), host_charset (), NULL); @@ -1037,17 +1018,16 @@ typy_richcompare (PyObject *self, PyObject *other, int op) result = true; else { - TRY + try { result = types_deeply_equal (type1, type2); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { /* If there is a GDB exception, a comparison is not capable (or trusted), so exit. */ GDB_PY_HANDLE_EXCEPTION (except); } - END_CATCH } if (op == (result ? Py_EQ : Py_NE)) @@ -1190,9 +1170,7 @@ typy_getitem (PyObject *self, PyObject *key) const char *t_field_name = TYPE_FIELD_NAME (type, i); if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0)) - { - return convert_field (type, i); - } + return convert_field (type, i).release (); } PyErr_SetObject (PyExc_KeyError, key); return NULL; @@ -1329,14 +1307,14 @@ typy_iterator_iternext (PyObject *self) { typy_iterator_object *iter_obj = (typy_iterator_object *) self; struct type *type = iter_obj->source->type; - PyObject *result; if (iter_obj->field < TYPE_NFIELDS (type)) { - result = make_fielditem (type, iter_obj->field, iter_obj->kind); + gdbpy_ref<> result = make_fielditem (type, iter_obj->field, + iter_obj->kind); if (result != NULL) iter_obj->field++; - return result; + return result.release (); } return NULL; @@ -1422,9 +1400,7 @@ gdbpy_initialize_types (void) for (i = 0; pyty_codes[i].name; ++i) { - if (PyModule_AddIntConstant (gdb_module, - /* Cast needed for Python 2.4. */ - (char *) pyty_codes[i].name, + if (PyModule_AddIntConstant (gdb_module, pyty_codes[i].name, pyty_codes[i].code) < 0) return -1; } @@ -1455,6 +1431,8 @@ static gdb_PyGetSetDef type_object_getset[] = "The size of this type, in bytes.", NULL }, { "tag", typy_get_tag, NULL, "The tag name for this type, or None.", NULL }, + { "objfile", typy_get_objfile, NULL, + "The objfile this type was defined in, or None.", NULL }, { NULL } };