Add an objfile getter to gdb.Type
authorChristian Biesinger via gdb-patches <gdb-patches@sourceware.org>
Thu, 23 May 2019 21:37:29 +0000 (16:37 -0500)
committerTom Tromey <tromey@adacore.com>
Tue, 4 Jun 2019 15:46:06 +0000 (09:46 -0600)
This allows users of the Python API to find the objfile where a type
was defined.

gdb/ChangeLog:

gdb/ChangeLog
2019-06-04  Christian Biesinger  <cbiesinger@google.com>

Add objfile property to gdb.Type.
* gdb/NEWS: Mention Python API addition.
* gdb/python/py-type.c (typy_get_objfile): New method.

gdb/doc/ChangeLog
2019-06-04  Christian Biesinger  <cbiesinger@google.com>

* gdb/doc/python.texi: Document new gdb.Type.objfile property.

gdb/testsuite/ChangeLog
2019-06-04  Christian Biesinger  <cbiesinger@google.com>

* gdb/testsuite/gdb.python/py-type.exp: Test for new
  gdb.Type.objfile property.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/python.texi
gdb/python/py-type.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-type.exp

index c17836e..933f232 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-04  Christian Biesinger  <cbiesinger@google.com>
+
+       Add objfile property to gdb.Type.
+       * gdb/NEWS: Mention Python API addition.
+       * gdb/python/py-type.c (typy_get_objfile): New method.
+
 2019-06-03  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * NEWS: Mention the new set|show style [title|highlight].
index 41f4f7a..ded1fce 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -27,6 +27,9 @@
      'array_indexes', 'symbols', 'unions', 'deref_refs', 'actual_objects',
      'static_members', 'max_elements', 'repeat_threshold', and 'format'.
 
+  ** gdb.Type has a new property 'objfile' which returns the objfile the
+     type was defined in.
+
 * New built-in convenience variables $_shell_exitcode and $_shell_exitsignal
   provide the exitcode or exit status of the shell commands launched by
   GDB commands such as "shell", "pipe" and "make".
index 59de4e6..ea98096 100644 (file)
@@ -1,3 +1,7 @@
+2019-06-04  Christian Biesinger  <cbiesinger@google.com>
+
+       * gdb/doc/python.texi: Document new gdb.Type.objfile property.
+
 2019-06-03  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * gdb.texinfo (Help): Document the new -v apropos flag.
index 98e52bb..f769ad0 100644 (file)
@@ -1087,6 +1087,11 @@ languages have this concept.  If this type has no tag name, then
 @code{None} is returned.
 @end defvar
 
+@defvar Type.objfile
+The @code{gdb.Objfile} that this type was defined in, or @code{None} if
+there is no associated objfile.
+@end defvar
+
 The following methods are provided:
 
 @defun Type.fields ()
index 22cc658..7b99bea 100644 (file)
@@ -413,6 +413,18 @@ 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)
@@ -1419,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 }
 };
 
index 75f87f5..af451fa 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-04  Christian Biesinger  <cbiesinger@google.com>
+
+       * gdb/testsuite/gdb.python/py-type.exp: Test for new
+         gdb.Type.objfile property.
+
 2019-06-03  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * lib/gdb.exp (help_list_trailer): New regexp variable
index 734f9b4..da4d4a7 100644 (file)
@@ -98,6 +98,8 @@ proc test_fields {lang} {
     gdb_py_test_silent_cmd "print (st)" "print value (st)" 1
     gdb_py_test_silent_cmd "python st = gdb.history (0)" "get value (st) from history" 1
     gdb_py_test_silent_cmd "python fields = st.type.fields()" "get fields from st.type" 1
+    gdb_test "python print (st.type.objfile.filename == gdb.current_progspace ().filename)" "True" \
+      "check type.objfile"
     gdb_test "python print (len(fields))" "2" "check number of fields (st)"
     gdb_test "python print (fields\[0\].name)" "a" "check structure field a name"
     gdb_test "python print (fields\[1\].name)" "b" "check structure field b name"
@@ -269,6 +271,8 @@ if { [build_inferior "${binfile}" "c"] == 0 } {
   # Skip all tests if Python scripting is not enabled.
   if { [skip_python_tests] } { continue }
 
+  gdb_test "python print (gdb.lookup_type ('char').objfile)" "None"
+
   gdb_test "python print(gdb.lookup_type('char').array(1, 0))" \
       "char \\\[0\\\]"