Change pspace_to_pspace_object to return a new reference
authorTom Tromey <tom@tromey.com>
Thu, 13 Sep 2018 03:44:19 +0000 (21:44 -0600)
committerTom Tromey <tom@tromey.com>
Sun, 16 Sep 2018 13:25:56 +0000 (07:25 -0600)
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.

gdb/ChangeLog
gdb/python/py-inferior.c
gdb/python/py-newobjfileevent.c
gdb/python/py-objfile.c
gdb/python/py-prettyprint.c
gdb/python/py-progspace.c
gdb/python/py-xmethods.c
gdb/python/python-internal.h
gdb/python/python.c

index deb3f67054d5982849173c3f906e9ed604895cbf..717d37bc2b0ecc0af47ad3117da64d4eb7280d8f 100644 (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>
 
        * python/lib/gdb/__init__.py (current_progspace, objfiles)
index 6db3df412eb70fafd5ccf2d014e3a76fec1a5932..512d9392d43f728537d54b51d1c16cf0e00a4585 100644 (file)
@@ -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
index a9341a3be18a29cc460769521ac5dc247c028fae..aa31fb4849b44f1d25a067d9d0b410b6fe7a2dab 100644 (file)
@@ -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;
index 61d3a15819866daa8f9c5ffd0e8adadf71b5bf62..722c9b053d822361b4b36c3dc703dd8a883d0186 100644 (file)
@@ -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;
 }
index 7da0f2d9af2c12269da0a494c727c016ffa9c97b..9aadd3b27c9ba535d58306f17fe9830423469f33 100644 (file)
@@ -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);
 }
 
index b88ad3c17738e74f2b6e702c045c6484842d766b..3c468475b1594788777e58cb9db2007121ac2b9b 100644 (file)
@@ -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<pspace_object> 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<pspace_object> 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
index f7e3c37210cc008e533ed522c58bb8a344fbb19a..c568295a165ebf62061cd1277d7a7d4d9d7a5b0a 100644 (file)
@@ -122,7 +122,6 @@ gdbpy_get_matching_xmethod_workers
    std::vector<xmethod_worker_up> *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 ()));
index 1c526af1586cb2d4abd84f121cbc1a0bc7ae86d8..58baa11ee45d23e253e1e4d0b06a4627e13724df 100644 (file)
@@ -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 *);
index f541a98789439e4ccd47e43a1fa250bfb5be7cf0..66b6631f93a33ba9d143466cd01fff96d3a55295 100644 (file)
@@ -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;
   }