[v2,1/3] python: Add Inferior.progspace property

Message ID 20180913023627.18855-1-simon.marchi@ericsson.com
State New, archived
Headers

Commit Message

Simon Marchi Sept. 13, 2018, 2:36 a.m. UTC
  New in v2: the bit in the gdb.current_progspace doc, stolen from Tom
Tromey's 2014 patch.

This patch adds a progspace property to the gdb.Inferior type, which
allows getting the gdb.Progspace object associated to that inferior.
In conjunction with the following patch, this will allow scripts iterate
on objfiles associated with a particular inferior.

While modifying py-inferior.exp, I added some checks for the other
Inferior properties, when the Inferior is no longer valid.  This doesn't
seem tested at the moment.

gdb/ChangeLog:

	* python/py-inferior.c (infpy_get_progspace): New function.
	(inferior_object_getset): Add progspace property.
	* NEWS: Mention the new property.

gdb/doc/ChangeLog:

	* python.texi (Inferiors In Python): Document
	Inferior.progspace.
	(Program Spaces In Python): Document that
	gdb.current_progspace() is the same as
	gdb.selected_inferior().progspace.

gdb/testsuite/ChangeLog:

	* gdb.python/py-inferior.exp: Add tests for Inferior.progspace
	and a few other Inferior properties when the Inferior is no
	longer valid.
---
 gdb/NEWS                                 |  5 +++++
 gdb/doc/python.texi                      |  8 +++++++-
 gdb/python/py-inferior.c                 | 18 ++++++++++++++++++
 gdb/testsuite/gdb.python/py-inferior.exp |  5 +++++
 4 files changed, 35 insertions(+), 1 deletion(-)
  

Comments

Eli Zaretskii Sept. 13, 2018, 1:45 p.m. UTC | #1
> From: Simon Marchi <simon.marchi@ericsson.com>
> CC: Simon Marchi <simon.marchi@ericsson.com>
> Date: Wed, 12 Sep 2018 22:36:25 -0400
> 
> -@xref{Inferiors and Programs}.
> +@xref{Inferiors and Programs}.  This is identical to
> +@code{gdb.selected_inferior().progspace} (@pxref{Inferiors In Python}) and is
                                          ^
This brace should be deleted.

Otherwise, the documentation parts are OK.  Thanks.
  
Simon Marchi Sept. 13, 2018, 1:50 p.m. UTC | #2
On 2018-09-13 09:45, Eli Zaretskii wrote:
>> From: Simon Marchi <simon.marchi@ericsson.com>
>> CC: Simon Marchi <simon.marchi@ericsson.com>
>> Date: Wed, 12 Sep 2018 22:36:25 -0400
>> 
>> -@xref{Inferiors and Programs}.
>> +@xref{Inferiors and Programs}.  This is identical to
>> +@code{gdb.selected_inferior().progspace} (@pxref{Inferiors In 
>> Python}) and is
>                                           ^
> This brace should be deleted.

The brace belongs there (it is the end of the @code), if I remove it I 
get a makeinfo error.

> Otherwise, the documentation parts are OK.  Thanks.

Thanks.

Simon
  
Eli Zaretskii Sept. 13, 2018, 2:20 p.m. UTC | #3
> Date: Thu, 13 Sep 2018 09:50:32 -0400
> From: Simon Marchi <simon.marchi@polymtl.ca>
> Cc: Simon Marchi <simon.marchi@ericsson.com>, gdb-patches@sourceware.org
> 
> > This brace should be deleted.
> 
> The brace belongs there (it is the end of the @code), if I remove it I 
> get a makeinfo error.

Sorry, you are right.  That was a long day.
  
Simon Marchi Sept. 13, 2018, 7:44 p.m. UTC | #4
On 2018-09-13 10:20, Eli Zaretskii wrote:
>> Date: Thu, 13 Sep 2018 09:50:32 -0400
>> From: Simon Marchi <simon.marchi@polymtl.ca>
>> Cc: Simon Marchi <simon.marchi@ericsson.com>, 
>> gdb-patches@sourceware.org
>> 
>> > This brace should be deleted.
>> 
>> The brace belongs there (it is the end of the @code), if I remove it I
>> get a makeinfo error.
> 
> Sorry, you are right.  That was a long day.

No worries, thanks for your comments.  I have pushed the three patches 
after addressing what you pointed out.

Simon
  

Patch

diff --git a/gdb/NEWS b/gdb/NEWS
index 4e4f12d8d13..73d95f2a559 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -84,6 +84,11 @@  GNU/Linux/RISC-V		riscv*-*-linux*
 CSKY ELF			csky*-*-elf
 CSKY GNU/LINUX			csky*-*-linux
 
+* Python API
+
+  ** The gdb.Inferior type has a new progspace property, which is the program
+     space associated to that inferior.
+
 *** 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 1c70088acea..ca3e651098f 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -2836,6 +2836,10 @@  Boolean signaling whether the inferior was created using `attach', or
 started by @value{GDBN} itself.
 @end defvar
 
+@defvar Inferior.progspace
+The inferior's program space.  @xref{Progspaces In Python}.
+@end defvar
+
 A @code{gdb.Inferior} object has the following methods:
 
 @defun Inferior.is_valid ()
@@ -3995,7 +3999,9 @@  The following progspace-related functions are available in the
 @findex gdb.current_progspace
 @defun gdb.current_progspace ()
 This function returns the program space of the currently selected inferior.
-@xref{Inferiors and Programs}.
+@xref{Inferiors and Programs}.  This is identical to
+@code{gdb.selected_inferior().progspace} (@pxref{Inferiors In Python}) and is
+included for historical compatibility.
 @end defun
 
 @findex gdb.progspaces
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index 56019bf9e05..727a8d2f306 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -459,6 +459,23 @@  infpy_get_was_attached (PyObject *self, void *closure)
   Py_RETURN_FALSE;
 }
 
+/* Getter of gdb.Inferior.progspace.  */
+
+static PyObject *
+infpy_get_progspace (PyObject *self, void *closure)
+{
+  inferior_object *inf = (inferior_object *) self;
+
+  INFPY_REQUIRE_VALID (inf);
+
+  program_space *pspace = inf->inferior->pspace;
+  gdb_assert (pspace != nullptr);
+
+  PyObject *py_pspace = pspace_to_pspace_object (pspace);
+  Py_XINCREF (py_pspace);
+  return py_pspace;
+}
+
 static int
 build_inferior_list (struct inferior *inf, void *arg)
 {
@@ -966,6 +983,7 @@  static gdb_PyGetSetDef inferior_object_getset[] =
     NULL },
   { "was_attached", infpy_get_was_attached, NULL,
     "True if the inferior was created using 'attach'.", NULL },
+  { "progspace", infpy_get_progspace, NULL, "Program space of this inferior" },
   { NULL }
 };
 
diff --git a/gdb/testsuite/gdb.python/py-inferior.exp b/gdb/testsuite/gdb.python/py-inferior.exp
index 077279f2f54..04d98cea06b 100644
--- a/gdb/testsuite/gdb.python/py-inferior.exp
+++ b/gdb/testsuite/gdb.python/py-inferior.exp
@@ -54,6 +54,9 @@  gdb_test "python print ('result = %s' % i0.pid)" " = \[0-9\]+" "test Inferior.pi
 gdb_test "python print ('result = %s' % i0.was_attached)" " = False" "test Inferior.was_attached"
 gdb_test "python print (i0.threads ())" "\\(<gdb.InferiorThread object at 0x\[\[:xdigit:\]\]+>,\\)" "test Inferior.threads"
 
+gdb_test "python print (i0.progspace)" "<gdb.Progspace object at $hex>"
+gdb_test "python print (i0.progspace == gdb.progspaces()\[0\])" "True"
+
 # Test the number of inferior threads.
 
 gdb_breakpoint check_threads
@@ -262,6 +265,8 @@  with_test_prefix "is_valid" {
 	"RuntimeError: Inferior no longer exists.*"
     gdb_test "python print (inf_list\[1\].was_attached)" \
 	"RuntimeError: Inferior no longer exists.*"
+    gdb_test "python print (inf_list\[1\].progspace)" \
+	"RuntimeError: Inferior no longer exists.*"
     gdb_test "python print (inf_list\[1\].threads ())" \
 	"RuntimeError: Inferior no longer exists.*"
     gdb_test "python print (inf_list\[1\].thread_from_thread_handle (1))" \