From: Simon Marchi <simon.marchi@ericsson.com>
To: <gdb-patches@sourceware.org>
Cc: Simon Marchi <simon.marchi@ericsson.com>
Subject: [PATCH 2/3] python: Add Progspace.objfiles method
Date: Wed, 12 Sep 2018 19:37:00 -0000 [thread overview]
Message-ID: <20180912193617.16523-2-simon.marchi@ericsson.com> (raw)
In-Reply-To: <20180912193617.16523-1-simon.marchi@ericsson.com>
This patch adds an objfiles method, 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().
Question:
When we try to access a property of an Inferior object that has
become invalid, for example, we raise an exception ("Inferior no longer
exists."). When doing the same with a Progspace object, we return None
(the only case for now is its filename property). For
Progspace.objfiles(), I made it return None too, but perhaps it should
throw an exception instead? Especially that None is not iterable, so
trying to do:
for obj in pspace.objfiles():
...
will fail horribly if we return None... so should I introduce a macro
similar to INFPY_REQUIRE_VALID?
gdb/ChangeLog:
* python/py-progspace.c (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.
gdb/testsuite/ChangeLog:
* gdb.python/py-progspace.exp: Test the Progspace.objfiles
method.
---
gdb/NEWS | 3 +++
gdb/doc/python.texi | 6 +++++
gdb/python/py-progspace.c | 23 +++++++++++++++--
gdb/python/python-internal.h | 4 +++
gdb/python/python.c | 28 +++++++++++++--------
gdb/testsuite/gdb.python/py-progspace.exp | 30 +++++++++++++++++++++++
6 files changed, 82 insertions(+), 12 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 21da6ae4ba8..f4d281eef0e 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -89,6 +89,9 @@ CSKY GNU/LINUX csky*-*-linux
** The program space associated to an inferior is now accessible through a
new "progspace" attribute of gdb.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/python.texi b/gdb/doc/python.texi
index d4f03439f10..abda135e17d 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -4073,6 +4073,12 @@ Hello.
[Inferior 1 (process 4242) exited normally]
@end smallexample
+A @code{gdb.Progspace} object has the following methods:
+
+@defun Progspace.objfiles ()
+Return a sequence of all the objfiles associated to this program space (@pxref{Objfiles In Python}).
+@end defun
+
@node Objfiles In Python
@subsubsection Objfiles In Python
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c
index 3eaa466666d..64587ab16aa 100644
--- a/gdb/python/py-progspace.c
+++ b/gdb/python/py-progspace.c
@@ -314,7 +314,19 @@ pspy_set_type_printers (PyObject *o, PyObject *value, void *ignore)
return 0;
}
-\f
+/* Implement the objfiles method. */
+
+PyObject *
+pspy_get_objfiles (PyObject *o, PyObject *unused2)
+{
+ pspace_object *self = (pspace_object *) o;
+
+ program_space *pspace = self->pspace;
+ if (pspace == nullptr)
+ Py_RETURN_NONE;
+
+ return build_objfiles_list (pspace).release ();
+}
/* Clear the PSPACE pointer in a Pspace object and remove the reference. */
@@ -397,6 +409,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 +445,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 3874fdc5e79..785ad171511 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 6f798a0e461..371f4a57529 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/gdb.python/py-progspace.exp b/gdb/testsuite/gdb.python/py-progspace.exp
index f0cafa834e0..53920c16fb0 100644
--- a/gdb/testsuite/gdb.python/py-progspace.exp
+++ b/gdb/testsuite/gdb.python/py-progspace.exp
@@ -51,3 +51,33 @@ 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 ())" "None"
--
2.19.0
next prev parent reply other threads:[~2018-09-12 19:37 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-12 19:37 [PATCH 1/3] python: Add Inferior.progspace property Simon Marchi
2018-09-12 19:36 ` [PATCH 3/3] python: Fix erroneous doc about gdb.objfiles() Simon Marchi
2018-09-12 21:46 ` Tom Tromey
2018-09-13 2:37 ` Eli Zaretskii
2018-09-13 2:42 ` Simon Marchi
2018-09-12 19:37 ` Simon Marchi [this message]
2018-09-12 22:01 ` [PATCH 2/3] python: Add Progspace.objfiles method Tom Tromey
2018-09-12 22:58 ` Simon Marchi
2018-09-13 4:50 ` Tom Tromey
2018-09-13 2:38 ` Eli Zaretskii
2018-09-12 21:42 ` [PATCH 1/3] python: Add Inferior.progspace property Tom Tromey
2018-09-12 22:22 ` Simon Marchi
2018-09-13 4:38 ` Tom Tromey
2018-09-13 22:16 ` Tom Tromey
2018-09-12 21:43 ` Tom Tromey
2018-09-13 2:37 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180912193617.16523-2-simon.marchi@ericsson.com \
--to=simon.marchi@ericsson.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox