From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 96590 invoked by alias); 12 Sep 2018 19:37:17 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 96466 invoked by uid 89); 12 Sep 2018 19:37:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3 autolearn=ham version=3.3.2 spammy=Especially, printers, *self, gdbpy_ref X-HELO: sesbmg23.ericsson.net Received: from sesbmg23.ericsson.net (HELO sesbmg23.ericsson.net) (193.180.251.37) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 12 Sep 2018 19:37:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; d=ericsson.com; s=mailgw201801; c=relaxed/simple; q=dns/txt; i=@ericsson.com; t=1536781032; h=From:Sender:Reply-To:Subject:Date:Message-Id:To:CC:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=ReKfV1KNS3nUCOYOsoBpmX2HjoFcWqJjYjRfMt4gq+s=; b=UoMvOqX57pFzO/OWjNScY9hwv7J5o7c+vJmtGodtOjSCFz9+5u22q1cQfoxfxWHa udz7gSnvqdMBG279O+xFnLBYLC+YBksb1h8O/cfBAsVBB4FZhpk+eZiVhbJxGfzo K4TiRaQ6JQCiynpnXTShTjDPmyUmQrrkjQ7Dkl95ryM=; Received: from ESESSMB501.ericsson.se (Unknown_Domain [153.88.183.119]) by sesbmg23.ericsson.net (Symantec Mail Security) with SMTP id DC.05.05037.8EA699B5; Wed, 12 Sep 2018 21:37:12 +0200 (CEST) Received: from ESESSMB505.ericsson.se (153.88.183.166) by ESESSMB501.ericsson.se (153.88.183.162) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3; Wed, 12 Sep 2018 21:36:47 +0200 Received: from NAM04-CO1-obe.outbound.protection.outlook.com (153.88.183.157) by ESESSMB505.ericsson.se (153.88.183.166) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1466.3 via Frontend Transport; Wed, 12 Sep 2018 21:36:46 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericsson.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Bsu6XHKzVi7Ts7urgNweyejCsoC+HpG3tIDJ8BWtnjs=; b=jPDf7etcwmaTKnzP/y4O7yrljRdTNWgL4Vf821rFcMkly7k9ZnsbDLNufJN+9C0ojc2QLz6PfiTR34piZJruaHuD/g5bpdncxvQBDSt1o1US5O9NZWlhtIb08TCOF4r/GT4gGDZAEn/i1DrIplFJbhi+NtQV1EmADAsgib8oGP0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=simon.marchi@ericsson.com; Received: from elxacz23q12.ericsson.se (192.176.1.81) by BYAPR15MB2389.namprd15.prod.outlook.com (2603:10b6:a02:8c::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1122.15; Wed, 12 Sep 2018 19:36:43 +0000 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH 2/3] python: Add Progspace.objfiles method Date: Wed, 12 Sep 2018 19:37:00 -0000 Message-Id: <20180912193617.16523-2-simon.marchi@ericsson.com> In-Reply-To: <20180912193617.16523-1-simon.marchi@ericsson.com> References: <20180912193617.16523-1-simon.marchi@ericsson.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain Return-Path: simon.marchi@ericsson.com Received-SPF: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) X-IsSubscribed: yes X-SW-Source: 2018-09/txt/msg00372.txt.bz2 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; } - +/* 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