X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-type.c;h=e8af6f60e1e5a35db388355b337a12f2136cad44;hb=268a13a5a3f7c6b9b6ffc5ac2d1b24eb41f3fbdc;hp=80055b05e05c72f9f9c10994984f5d1529854284;hpb=894882e344735ace5231f179484086f7697d27cc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 80055b05e0..e8af6f60e1 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -1,6 +1,6 @@ /* Python interface to types. - Copyright (C) 2008-2018 Free Software Foundation, Inc. + Copyright (C) 2008-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -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; @@ -416,10 +401,28 @@ static PyObject * typy_get_tag (PyObject *self, void *closure) { struct type *type = ((type_object *) self)->type; + const char *tagname = nullptr; - if (!TYPE_TAG_NAME (type)) + if (TYPE_CODE (type) == TYPE_CODE_STRUCT + || TYPE_CODE (type) == TYPE_CODE_UNION + || TYPE_CODE (type) == TYPE_CODE_ENUM) + tagname = TYPE_NAME (type); + + if (tagname == nullptr) + Py_RETURN_NONE; + 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 PyString_FromString (TYPE_TAG_NAME (type)); + return objfile_to_objfile_object (objfile).release (); } /* Return the type, stripped of typedefs. */ @@ -428,15 +431,14 @@ 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); } @@ -450,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; @@ -518,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); } @@ -555,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); } @@ -624,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); } @@ -659,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); } @@ -678,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); } @@ -697,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); } @@ -716,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. */ @@ -737,19 +731,18 @@ 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. */ - return gdb_py_object_from_ulongest (align); + return gdb_py_object_from_ulongest (align).release (); } static struct type * @@ -757,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); @@ -769,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; } @@ -799,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 @@ -824,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 @@ -853,7 +844,7 @@ typy_legacy_template_argument (struct type *type, const struct block *block, int i; struct demangle_component *demangled; std::unique_ptr info; - const char *err; + std::string err; struct type *argtype; if (TYPE_NAME (type) == NULL) @@ -862,20 +853,19 @@ 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) { - PyErr_SetString (PyExc_RuntimeError, err); + PyErr_SetString (PyExc_RuntimeError, err.c_str ()); return NULL; } demangled = info->tree; @@ -924,6 +914,13 @@ typy_template_argument (PyObject *self, PyObject *args) if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj)) return NULL; + if (argno < 0) + { + PyErr_SetString (PyExc_RuntimeError, + _("Template argument number must be non-negative")); + return NULL; + } + if (block_obj) { block = block_object_to_block (block_obj); @@ -935,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 -- @@ -970,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); } @@ -988,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); @@ -1024,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)) @@ -1177,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; @@ -1316,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; @@ -1389,7 +1380,7 @@ gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw) if (! type) return NULL; - return (PyObject *) type_to_type_object (type); + return type_to_type_object (type); } int @@ -1409,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; } @@ -1442,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 } };