From 3c7aa30778a1615d88c13508c04138ef2499112d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 12 Sep 2018 21:44:19 -0600 Subject: [PATCH] Change pspace_to_pspace_object to return a new reference This changes pspace_to_pspace_object to return a new reference and fixes up all the callers. gdb/ChangeLog 2018-09-16 Tom Tromey * python/py-inferior.c (infpy_get_progspace): Update. * python/python-internal.h (pspace_to_pspace_object): Change return type. * python/py-newobjfileevent.c (create_clear_objfiles_event_object): Update. * python/py-xmethods.c (gdbpy_get_matching_xmethod_workers): Update. * python/python.c (gdbpy_get_current_progspace): Update. (gdbpy_progspaces): Update. * python/py-progspace.c (pspace_to_pspace_object): Return a new reference. * python/py-objfile.c (objfpy_get_progspace): Update. * python/py-prettyprint.c (find_pretty_printer_from_progspace): Update. --- gdb/ChangeLog | 17 +++++++++++++++++ gdb/python/py-inferior.c | 4 +--- gdb/python/py-newobjfileevent.c | 10 ++++------ gdb/python/py-objfile.c | 7 +------ gdb/python/py-prettyprint.c | 6 +++--- gdb/python/py-progspace.c | 29 +++++++++++++++-------------- gdb/python/py-xmethods.c | 6 +++--- gdb/python/python-internal.h | 3 +-- gdb/python/python.c | 4 ++-- 9 files changed, 47 insertions(+), 39 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index deb3f67054..717d37bc2b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2018-09-16 Tom Tromey + + * python/py-inferior.c (infpy_get_progspace): Update. + * python/python-internal.h (pspace_to_pspace_object): Change + return type. + * python/py-newobjfileevent.c + (create_clear_objfiles_event_object): Update. + * python/py-xmethods.c (gdbpy_get_matching_xmethod_workers): + Update. + * python/python.c (gdbpy_get_current_progspace): Update. + (gdbpy_progspaces): Update. + * python/py-progspace.c (pspace_to_pspace_object): Return a new + reference. + * python/py-objfile.c (objfpy_get_progspace): Update. + * python/py-prettyprint.c (find_pretty_printer_from_progspace): + Update. + 2018-09-16 Tom Tromey * python/lib/gdb/__init__.py (current_progspace, objfiles) diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 6db3df412e..512d9392d4 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -471,9 +471,7 @@ infpy_get_progspace (PyObject *self, void *closure) 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; + return pspace_to_pspace_object (pspace).release (); } static int diff --git a/gdb/python/py-newobjfileevent.c b/gdb/python/py-newobjfileevent.c index a9341a3be1..aa31fb4849 100644 --- a/gdb/python/py-newobjfileevent.c +++ b/gdb/python/py-newobjfileevent.c @@ -66,12 +66,10 @@ create_clear_objfiles_event_object (void) if (objfile_event == NULL) return NULL; - /* Note that pspace_to_pspace_object returns a borrowed reference, - so we don't need a decref here. */ - PyObject *py_progspace = pspace_to_pspace_object (current_program_space); - if (!py_progspace || evpy_add_attribute (objfile_event.get (), - "progspace", - py_progspace) < 0) + gdbpy_ref<> py_progspace = pspace_to_pspace_object (current_program_space); + if (py_progspace == NULL || evpy_add_attribute (objfile_event.get (), + "progspace", + py_progspace.get ()) < 0) return NULL; return objfile_event; diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 61d3a15819..722c9b053d 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -166,12 +166,7 @@ objfpy_get_progspace (PyObject *self, void *closure) objfile_object *obj = (objfile_object *) self; if (obj->objfile) - { - PyObject *pspace = pspace_to_pspace_object (obj->objfile->pspace); - - Py_XINCREF (pspace); - return pspace; - } + return pspace_to_pspace_object (obj->objfile->pspace).release (); Py_RETURN_NONE; } diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index 7da0f2d9af..9aadd3b27c 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -128,11 +128,11 @@ find_pretty_printer_from_objfiles (PyObject *value) static PyObject * find_pretty_printer_from_progspace (PyObject *value) { - PyObject *obj = pspace_to_pspace_object (current_program_space); + gdbpy_ref<> obj = pspace_to_pspace_object (current_program_space); - if (!obj) + if (obj == NULL) return NULL; - gdbpy_ref<> pp_list (pspy_get_printers (obj, NULL)); + gdbpy_ref<> pp_list (pspy_get_printers (obj.get (), NULL)); return search_pp_list (pp_list.get (), value); } diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index b88ad3c177..3c468475b1 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -492,30 +492,31 @@ py_free_pspace (struct program_space *pspace, void *datum) object->pspace = NULL; } -/* Return a borrowed reference to the Python object of type Pspace +/* Return a new reference to the Python object of type Pspace representing PSPACE. If the object has already been created, return it. Otherwise, create it. Return NULL and set the Python error on failure. */ -PyObject * +gdbpy_ref<> pspace_to_pspace_object (struct program_space *pspace) { - gdbpy_ref object - ((pspace_object *) program_space_data (pspace, pspy_pspace_data_key)); - if (object == NULL) + PyObject *result + ((PyObject *) program_space_data (pspace, pspy_pspace_data_key)); + if (result == NULL) { - object.reset (PyObject_New (pspace_object, &pspace_object_type)); - if (object != NULL) - { - if (!pspy_initialize (object.get ())) - return NULL; + gdbpy_ref object + ((pspace_object *) PyObject_New (pspace_object, &pspace_object_type)); + if (object == NULL) + return NULL; + if (!pspy_initialize (object.get ())) + return NULL; - object->pspace = pspace; - set_program_space_data (pspace, pspy_pspace_data_key, object.get ()); - } + object->pspace = pspace; + set_program_space_data (pspace, pspy_pspace_data_key, object.get ()); + result = (PyObject *) object.release (); } - return (PyObject *) object.release (); + return gdbpy_ref<>::new_reference (result); } int diff --git a/gdb/python/py-xmethods.c b/gdb/python/py-xmethods.c index f7e3c37210..c568295a16 100644 --- a/gdb/python/py-xmethods.c +++ b/gdb/python/py-xmethods.c @@ -122,7 +122,6 @@ gdbpy_get_matching_xmethod_workers std::vector *dm_vec) { struct objfile *objfile; - PyObject *py_progspace; gdb_assert (obj_type != NULL && method_name != NULL); @@ -170,10 +169,11 @@ gdbpy_get_matching_xmethod_workers /* Gather debug methods matchers registered with the current program space. */ - py_progspace = pspace_to_pspace_object (current_program_space); + gdbpy_ref<> py_progspace = pspace_to_pspace_object (current_program_space); if (py_progspace != NULL) { - gdbpy_ref<> pspace_matchers (pspy_get_xmethods (py_progspace, NULL)); + gdbpy_ref<> pspace_matchers (pspy_get_xmethods (py_progspace.get (), + NULL)); gdbpy_ref<> temp (PySequence_Concat (py_xmethod_matcher_list.get (), pspace_matchers.get ())); diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 1c526af158..58baa11ee4 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -516,8 +516,7 @@ PyObject *value_to_value_object (struct value *v); PyObject *type_to_type_object (struct type *); PyObject *frame_info_to_frame_object (struct frame_info *frame); PyObject *symtab_to_linetable_object (PyObject *symtab); -PyObject *pspace_to_pspace_object (struct program_space *) - CPYCHECKER_RETURNS_BORROWED_REF; +gdbpy_ref<> pspace_to_pspace_object (struct program_space *); PyObject *pspy_get_printers (PyObject *, void *); PyObject *pspy_get_frame_filters (PyObject *, void *); PyObject *pspy_get_frame_unwinders (PyObject *, void *); diff --git a/gdb/python/python.c b/gdb/python/python.c index f541a98789..66b6631f93 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1293,9 +1293,9 @@ gdbpy_progspaces (PyObject *unused1, PyObject *unused2) ALL_PSPACES (ps) { - PyObject *item = pspace_to_pspace_object (ps); + gdbpy_ref<> item = pspace_to_pspace_object (ps); - if (!item || PyList_Append (list.get (), item) == -1) + if (item == NULL || PyList_Append (list.get (), item.get ()) == -1) return NULL; } -- 2.34.1