X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-type.c;h=7b99beacae02ad3b1e535aaf0fcb87c434dd4de4;hb=e1f2e1a2dadbaeffe0a8a6da7aab7effc6b046d2;hp=7ad1a0c70e845d0743d122921a3a8acbbb7f6e85;hpb=0747795c085d3b2a35da6bb474f32c58ce1b70c8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 7ad1a0c70e..7b99beacae 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -198,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; } @@ -314,15 +312,14 @@ typy_fields_items (PyObject *self, enum gdbpy_iter_kind kind) 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) @@ -416,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); } @@ -444,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; @@ -512,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); } @@ -549,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); } @@ -618,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); } @@ -653,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); } @@ -672,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); } @@ -691,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); } @@ -710,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. */ @@ -731,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. */ @@ -751,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); @@ -763,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; } @@ -793,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 @@ -818,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 @@ -856,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) { @@ -936,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 -- @@ -971,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); } @@ -989,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); @@ -1025,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)) @@ -1408,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; } @@ -1441,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 } };