diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2018-09-13 15:40:41 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2018-09-13 15:42:12 -0400 |
commit | 0ae1a3211adcb8e7518b0b656b2309ebbc45e9ae (patch) | |
tree | 96c5436eeaac8f151adfd96c5fc17117b8f3b4ba | |
parent | a40bf0c2e93daac4ae4ce7dd1c43ab6135e76720 (diff) | |
download | gdb-0ae1a3211adcb8e7518b0b656b2309ebbc45e9ae.zip gdb-0ae1a3211adcb8e7518b0b656b2309ebbc45e9ae.tar.gz gdb-0ae1a3211adcb8e7518b0b656b2309ebbc45e9ae.tar.bz2 |
python: Add Progspace.objfiles method
This patch adds an objfiles method to the Progspace object, which
returns a sequence of the objfiles associated to that program space. I
chose a method rather than a property for symmetry with gdb.objfiles().
gdb/ChangeLog:
* python/py-progspace.c (PSPY_REQUIRE_VALID): New macro.
(pspy_get_objfiles): New function.
(progspace_object_methods): New.
(pspace_object_type): Add tp_methods callback.
* python/python-internal.h (build_objfiles_list): New
declaration.
* python/python.c (build_objfiles_list): New function.
(gdbpy_objfiles): Implement using build_objfiles_list.
* NEWS: Mention the Progspace.objfiles method.
gdb/doc/ChangeLog:
* python.texi (Program Spaces In Python): Document the
Progspace.objfiles method.
(Objfiles In Python): Mention that gdb.objfiles() is identical
to gdb.selected_inferior().progspace.objfiles().
gdb/testsuite/ChangeLog:
* gdb.python/py-progspace.exp: Test the Progspace.objfiles
method.
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/NEWS | 3 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/doc/python.texi | 12 | ||||
-rw-r--r-- | gdb/python/py-progspace.c | 32 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 4 | ||||
-rw-r--r-- | gdb/python/python.c | 28 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-progspace.exp | 31 |
9 files changed, 122 insertions, 14 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8ec110c..4c52a65 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,4 +1,17 @@ 2018-09-13 Simon Marchi <simon.marchi@ericsson.com> +2018-09-13 Tom Tromey <tom@tromey.com> + + * python/py-progspace.c (PSPY_REQUIRE_VALID): New macro. + (pspy_get_objfiles): New function. + (progspace_object_methods): New. + (pspace_object_type): Add tp_methods callback. + * python/python-internal.h (build_objfiles_list): New + declaration. + * python/python.c (build_objfiles_list): New function. + (gdbpy_objfiles): Implement using build_objfiles_list. + * NEWS: Mention the Progspace.objfiles method. + +2018-09-13 Simon Marchi <simon.marchi@ericsson.com> * python/py-inferior.c (infpy_get_progspace): New function. (inferior_object_getset): Add progspace property. @@ -89,6 +89,9 @@ CSKY GNU/LINUX csky*-*-linux ** The gdb.Inferior type has a new 'progspace' property, which is the program space associated to that inferior. + ** The gdb.Progspace type has a new 'objfiles' method, which returns the list + of objfiles associated to that program space. + *** Changes in GDB 8.2 * The 'set disassembler-options' command now supports specifying options diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 4750c34..e6d5c8f 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,6 +1,14 @@ 2018-09-13 Simon Marchi <simon.marchi@ericsson.com> 2018-09-13 Tom Tromey <tom@tromey.com> + * python.texi (Program Spaces In Python): Document the + Progspace.objfiles method. + (Objfiles In Python): Mention that gdb.objfiles() is identical + to gdb.selected_inferior().progspace.objfiles(). + +2018-09-13 Simon Marchi <simon.marchi@ericsson.com> +2018-09-13 Tom Tromey <tom@tromey.com> + * python.texi (Inferiors In Python): Document Inferior.progspace. (Program Spaces In Python): Document that diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 75d8ae1..896e27b 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -4079,6 +4079,14 @@ Hello. [Inferior 1 (process 4242) exited normally] @end smallexample +A @code{gdb.Progspace} object has the following methods: + +@findex Progspace.objfiles +@defun Progspace.objfiles () +Return a sequence of all the objfiles referenced by this program +space. @xref{Objfiles In Python}. +@end defun + @node Objfiles In Python @subsubsection Objfiles In Python @@ -4105,7 +4113,9 @@ this function returns @code{None}. @findex gdb.objfiles @defun gdb.objfiles () Return a sequence of all the objfiles current known to @value{GDBN}. -@xref{Objfiles In Python}. +@xref{Objfiles In Python}. This is identical to +@code{gdb.selected_inferior().progspace.objfiles()} (@pxref{Progspaces In +Python}) and is included for historical compatibility. @end defun @findex gdb.lookup_objfile diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index 3eaa466..e01338f 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -58,7 +58,16 @@ extern PyTypeObject pspace_object_type static const struct program_space_data *pspy_pspace_data_key; - +/* Require that PSPACE_OBJ be a valid program space ID. */ +#define PSPY_REQUIRE_VALID(pspace_obj) \ + do { \ + if (pspace_obj->pspace == nullptr) \ + { \ + PyErr_SetString (PyExc_RuntimeError, \ + _("Program space no longer exists.")); \ + return NULL; \ + } \ + } while (0) /* An Objfile method which returns the objfile's file name, or None. */ @@ -314,7 +323,17 @@ pspy_set_type_printers (PyObject *o, PyObject *value, void *ignore) return 0; } - +/* Implement the objfiles method. */ + +static PyObject * +pspy_get_objfiles (PyObject *self_, PyObject *args) +{ + pspace_object *self = (pspace_object *) self_; + + PSPY_REQUIRE_VALID (self); + + return build_objfiles_list (self->pspace).release (); +} /* Clear the PSPACE pointer in a Pspace object and remove the reference. */ @@ -397,6 +416,13 @@ static gdb_PyGetSetDef pspace_getset[] = { NULL } }; +static PyMethodDef progspace_object_methods[] = +{ + { "objfiles", pspy_get_objfiles, METH_NOARGS, + "Return a sequence of objfiles associated to this program space." }, + { NULL } +}; + PyTypeObject pspace_object_type = { PyVarObject_HEAD_INIT (NULL, 0) @@ -426,7 +452,7 @@ PyTypeObject pspace_object_type = 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + progspace_object_methods, /* tp_methods */ 0, /* tp_members */ pspace_getset, /* tp_getset */ 0, /* tp_base */ diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 3874fdc..785ad17 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -549,6 +549,10 @@ struct symtab_and_line *sal_object_to_symtab_and_line (PyObject *obj); struct frame_info *frame_object_to_frame_info (PyObject *frame_obj); struct gdbarch *arch_object_to_gdbarch (PyObject *obj); +/* Return a Python list containing an Objfile object for each objfile in + PSPACE. */ +gdbpy_ref<> build_objfiles_list (program_space *pspace); + void gdbpy_initialize_gdb_readline (void); int gdbpy_initialize_auto_load (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; diff --git a/gdb/python/python.c b/gdb/python/python.c index 6f798a0..371f4a5 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1437,10 +1437,10 @@ gdbpy_get_current_objfile (PyObject *unused1, PyObject *unused2) return result; } -/* Return a sequence holding all the Objfiles. */ +/* See python-internal.h. */ -static PyObject * -gdbpy_objfiles (PyObject *unused1, PyObject *unused2) +gdbpy_ref<> +build_objfiles_list (program_space *pspace) { struct objfile *objf; @@ -1448,15 +1448,23 @@ gdbpy_objfiles (PyObject *unused1, PyObject *unused2) if (list == NULL) return NULL; - ALL_OBJFILES (objf) - { - PyObject *item = objfile_to_objfile_object (objf); + ALL_PSPACE_OBJFILES (pspace, objf) + { + PyObject *item = objfile_to_objfile_object (objf); - if (!item || PyList_Append (list.get (), item) == -1) - return NULL; - } + if (item == nullptr || PyList_Append (list.get (), item) == -1) + return NULL; + } - return list.release (); + return list; +} + +/* Return a sequence holding all the Objfiles. */ + +static PyObject * +gdbpy_objfiles (PyObject *unused1, PyObject *unused2) +{ + return build_objfiles_list (current_program_space).release (); } /* Compute the list of active python type printers and store them in diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 553eaab..97613f3 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2018-09-13 Simon Marchi <simon.marchi@ericsson.com> + * gdb.python/py-progspace.exp: Test the Progspace.objfiles + method. + +2018-09-13 Simon Marchi <simon.marchi@ericsson.com> + * gdb.python/py-inferior.exp: Add tests for Inferior.progspace and a few other Inferior properties when the Inferior is no longer valid. diff --git a/gdb/testsuite/gdb.python/py-progspace.exp b/gdb/testsuite/gdb.python/py-progspace.exp index f0cafa8..fa1ffd9 100644 --- a/gdb/testsuite/gdb.python/py-progspace.exp +++ b/gdb/testsuite/gdb.python/py-progspace.exp @@ -51,3 +51,34 @@ gdb_py_test_silent_cmd "python progspace.random_attribute = 42" \ "Set random attribute in progspace" 1 gdb_test "python print (progspace.random_attribute)" "42" \ "Verify set of random attribute in progspace" + +if {![runto_main]} { + fail "can't run to main" + return +} + +# With a single inferior, progspace.objfiles () and gdb.objfiles () should +# be identical. +gdb_test "python print (progspace.objfiles () == gdb.objfiles ())" "True" + +gdb_test "add-inferior" +gdb_test "inferior 2" + +gdb_load ${binfile} + +# With a second (non-started) inferior, we should have a single objfile - the +# main one. +gdb_test "python print (len (gdb.objfiles ())) == 1" + +# And the gdb.objfiles() list should now be different from the objfiles of the +# prog space of inferior 1. +gdb_test "python print (progspace.objfiles () != gdb.objfiles ())" "True" + +# Delete inferior 2 (and therefore the second progspace), check that the Python +# object reacts sensibly. +gdb_py_test_silent_cmd "python progspace2 = gdb.current_progspace()" \ + "save progspace 2" 1 +gdb_test "inferior 1" "Switching to inferior 1.*" +gdb_test_no_output "remove-inferiors 2" +gdb_test "python print (progspace2.objfiles ())" \ + "RuntimeError: Program space no longer exists.*" |