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  <tom@tromey.com>

	* 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.
This commit is contained in:
Tom Tromey 2018-09-12 21:44:19 -06:00
parent 8743a9cdd2
commit 3c7aa30778
9 changed files with 47 additions and 39 deletions

View file

@ -1,3 +1,20 @@
2018-09-16 Tom Tromey <tom@tromey.com>
* 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 <tom@tromey.com> 2018-09-16 Tom Tromey <tom@tromey.com>
* python/lib/gdb/__init__.py (current_progspace, objfiles) * python/lib/gdb/__init__.py (current_progspace, objfiles)

View file

@ -471,9 +471,7 @@ infpy_get_progspace (PyObject *self, void *closure)
program_space *pspace = inf->inferior->pspace; program_space *pspace = inf->inferior->pspace;
gdb_assert (pspace != nullptr); gdb_assert (pspace != nullptr);
PyObject *py_pspace = pspace_to_pspace_object (pspace); return pspace_to_pspace_object (pspace).release ();
Py_XINCREF (py_pspace);
return py_pspace;
} }
static int static int

View file

@ -66,12 +66,10 @@ create_clear_objfiles_event_object (void)
if (objfile_event == NULL) if (objfile_event == NULL)
return NULL; return NULL;
/* Note that pspace_to_pspace_object returns a borrowed reference, gdbpy_ref<> py_progspace = pspace_to_pspace_object (current_program_space);
so we don't need a decref here. */ if (py_progspace == NULL || evpy_add_attribute (objfile_event.get (),
PyObject *py_progspace = pspace_to_pspace_object (current_program_space);
if (!py_progspace || evpy_add_attribute (objfile_event.get (),
"progspace", "progspace",
py_progspace) < 0) py_progspace.get ()) < 0)
return NULL; return NULL;
return objfile_event; return objfile_event;

View file

@ -166,12 +166,7 @@ objfpy_get_progspace (PyObject *self, void *closure)
objfile_object *obj = (objfile_object *) self; objfile_object *obj = (objfile_object *) self;
if (obj->objfile) if (obj->objfile)
{ return pspace_to_pspace_object (obj->objfile->pspace).release ();
PyObject *pspace = pspace_to_pspace_object (obj->objfile->pspace);
Py_XINCREF (pspace);
return pspace;
}
Py_RETURN_NONE; Py_RETURN_NONE;
} }

View file

@ -128,11 +128,11 @@ find_pretty_printer_from_objfiles (PyObject *value)
static PyObject * static PyObject *
find_pretty_printer_from_progspace (PyObject *value) 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; 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); return search_pp_list (pp_list.get (), value);
} }

View file

@ -492,30 +492,31 @@ py_free_pspace (struct program_space *pspace, void *datum)
object->pspace = NULL; 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, representing PSPACE. If the object has already been created,
return it. Otherwise, create it. Return NULL and set the Python return it. Otherwise, create it. Return NULL and set the Python
error on failure. */ error on failure. */
PyObject * gdbpy_ref<>
pspace_to_pspace_object (struct program_space *pspace) pspace_to_pspace_object (struct program_space *pspace)
{ {
PyObject *result
((PyObject *) program_space_data (pspace, pspy_pspace_data_key));
if (result == NULL)
{
gdbpy_ref<pspace_object> object gdbpy_ref<pspace_object> object
((pspace_object *) program_space_data (pspace, pspy_pspace_data_key)); ((pspace_object *) PyObject_New (pspace_object, &pspace_object_type));
if (object == NULL) if (object == NULL)
{ return NULL;
object.reset (PyObject_New (pspace_object, &pspace_object_type));
if (object != NULL)
{
if (!pspy_initialize (object.get ())) if (!pspy_initialize (object.get ()))
return NULL; return NULL;
object->pspace = pspace; object->pspace = pspace;
set_program_space_data (pspace, pspy_pspace_data_key, object.get ()); 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 int

View file

@ -122,7 +122,6 @@ gdbpy_get_matching_xmethod_workers
std::vector<xmethod_worker_up> *dm_vec) std::vector<xmethod_worker_up> *dm_vec)
{ {
struct objfile *objfile; struct objfile *objfile;
PyObject *py_progspace;
gdb_assert (obj_type != NULL && method_name != NULL); 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 /* Gather debug methods matchers registered with the current program
space. */ 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) 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 (), gdbpy_ref<> temp (PySequence_Concat (py_xmethod_matcher_list.get (),
pspace_matchers.get ())); pspace_matchers.get ()));

View file

@ -516,8 +516,7 @@ PyObject *value_to_value_object (struct value *v);
PyObject *type_to_type_object (struct type *); PyObject *type_to_type_object (struct type *);
PyObject *frame_info_to_frame_object (struct frame_info *frame); PyObject *frame_info_to_frame_object (struct frame_info *frame);
PyObject *symtab_to_linetable_object (PyObject *symtab); PyObject *symtab_to_linetable_object (PyObject *symtab);
PyObject *pspace_to_pspace_object (struct program_space *) gdbpy_ref<> pspace_to_pspace_object (struct program_space *);
CPYCHECKER_RETURNS_BORROWED_REF;
PyObject *pspy_get_printers (PyObject *, void *); PyObject *pspy_get_printers (PyObject *, void *);
PyObject *pspy_get_frame_filters (PyObject *, void *); PyObject *pspy_get_frame_filters (PyObject *, void *);
PyObject *pspy_get_frame_unwinders (PyObject *, void *); PyObject *pspy_get_frame_unwinders (PyObject *, void *);

View file

@ -1293,9 +1293,9 @@ gdbpy_progspaces (PyObject *unused1, PyObject *unused2)
ALL_PSPACES (ps) 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; return NULL;
} }