Change objfile_to_objfile_object to return a new reference
authorTom Tromey <tom@tromey.com>
Thu, 13 Sep 2018 05:06:09 +0000 (23:06 -0600)
committerTom Tromey <tom@tromey.com>
Sun, 16 Sep 2018 13:25:56 +0000 (07:25 -0600)
This changes objfile_to_objfile_object to return a new references and
fixes up all the uses.

gdb/ChangeLog
2018-09-16  Tom Tromey  <tom@tromey.com>

* python/py-progspace.c (pspy_get_objfiles): Update.
* python/python-internal.h (objfile_to_objfile_object): Change
return type.
* python/py-newobjfileevent.c (create_new_objfile_event_object):
Update.
* python/py-xmethods.c (gdbpy_get_matching_xmethod_workers):
Update.
* python/python.c (gdbpy_get_current_objfile): Update.
(gdbpy_objfiles): Update.
* python/py-objfile.c (objfpy_get_owner, gdbpy_lookup_objfile):
Update.
(objfile_to_objfile_object): Return a new reference.
* python/py-symtab.c (stpy_get_objfile): Update.
* python/py-prettyprint.c (find_pretty_printer_from_objfiles):
Update.

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

index 717d37bc2b0ecc0af47ad3117da64d4eb7280d8f..b673acd1616b6e9b130432afc0cf5daa2f2c80f9 100644 (file)
@@ -1,3 +1,21 @@
+2018-09-16  Tom Tromey  <tom@tromey.com>
+
+       * python/py-progspace.c (pspy_get_objfiles): Update.
+       * python/python-internal.h (objfile_to_objfile_object): Change
+       return type.
+       * python/py-newobjfileevent.c (create_new_objfile_event_object):
+       Update.
+       * python/py-xmethods.c (gdbpy_get_matching_xmethod_workers):
+       Update.
+       * python/python.c (gdbpy_get_current_objfile): Update.
+       (gdbpy_objfiles): Update.
+       * python/py-objfile.c (objfpy_get_owner, gdbpy_lookup_objfile):
+       Update.
+       (objfile_to_objfile_object): Return a new reference.
+       * python/py-symtab.c (stpy_get_objfile): Update.
+       * python/py-prettyprint.c (find_pretty_printer_from_objfiles):
+       Update.
+
 2018-09-16  Tom Tromey  <tom@tromey.com>
 
        * python/py-inferior.c (infpy_get_progspace): Update.
index aa31fb4849b44f1d25a067d9d0b410b6fe7a2dab..55e884dcaf5d7778af50665d987c47f5a811ec75 100644 (file)
@@ -28,12 +28,10 @@ create_new_objfile_event_object (struct objfile *objfile)
   if (objfile_event == NULL)
     return NULL;
 
-  /* Note that objfile_to_objfile_object returns a borrowed reference,
-     so we don't need a decref here.  */
-  PyObject *py_objfile = objfile_to_objfile_object (objfile);
-  if (!py_objfile || evpy_add_attribute (objfile_event.get (),
-                                         "new_objfile",
-                                         py_objfile) < 0)
+  gdbpy_ref<> py_objfile = objfile_to_objfile_object (objfile);
+  if (py_objfile == NULL || evpy_add_attribute (objfile_event.get (),
+                                               "new_objfile",
+                                               py_objfile.get ()) < 0)
     return NULL;
 
   return objfile_event;
index 722c9b053d822361b4b36c3dc703dd8a883d0186..2e24d0f3ff20687c989af9c15bc8a118f2553068 100644 (file)
@@ -115,12 +115,7 @@ objfpy_get_owner (PyObject *self, void *closure)
 
   owner = objfile->separate_debug_objfile_backlink;
   if (owner != NULL)
-    {
-      PyObject *result = objfile_to_objfile_object (owner);
-
-      Py_XINCREF (result);
-      return result;
-    }
+    return objfile_to_objfile_object (owner).release ();
   Py_RETURN_NONE;
 }
 
@@ -602,12 +597,7 @@ gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw)
     objfile = objfpy_lookup_objfile_by_name (name);
 
   if (objfile != NULL)
-    {
-      PyObject *result = objfile_to_objfile_object (objfile);
-
-      Py_XINCREF (result);
-      return result;
-    }
+    return objfile_to_objfile_object (objfile).release ();
 
   PyErr_SetString (PyExc_ValueError, _("Objfile not found."));
   return NULL;
@@ -625,30 +615,31 @@ py_free_objfile (struct objfile *objfile, void *datum)
   object->objfile = NULL;
 }
 
-/* Return a borrowed reference to the Python object of type Objfile
+/* Return a new reference to the Python object of type Objfile
    representing OBJFILE.  If the object has already been created,
    return it.  Otherwise, create it.  Return NULL and set the Python
    error on failure.  */
 
-PyObject *
+gdbpy_ref<>
 objfile_to_objfile_object (struct objfile *objfile)
 {
-  gdbpy_ref<objfile_object> object
-    ((objfile_object *) objfile_data (objfile, objfpy_objfile_data_key));
-  if (object == NULL)
+  PyObject *result
+    = ((PyObject *) objfile_data (objfile, objfpy_objfile_data_key));
+  if (result == NULL)
     {
-      object.reset (PyObject_New (objfile_object, &objfile_object_type));
-      if (object != NULL)
-       {
-         if (!objfpy_initialize (object.get ()))
-           return NULL;
+      gdbpy_ref<objfile_object> object
+       ((objfile_object *) PyObject_New (objfile_object, &objfile_object_type));
+      if (object == NULL)
+       return NULL;
+      if (!objfpy_initialize (object.get ()))
+       return NULL;
 
-         object->objfile = objfile;
-         set_objfile_data (objfile, objfpy_objfile_data_key, object.get ());
-       }
+      object->objfile = objfile;
+      set_objfile_data (objfile, objfpy_objfile_data_key, object.get ());
+      result = (PyObject *) object.release ();
     }
 
-  return (PyObject *) object.release ();
+  return gdbpy_ref<>::new_reference (result);
 }
 
 int
index 9aadd3b27c9ba535d58306f17fe9830423469f33..a7062225816a69ccb74729911d65805cdfd45f7f 100644 (file)
@@ -97,15 +97,15 @@ find_pretty_printer_from_objfiles (PyObject *value)
 
   ALL_OBJFILES (obj)
   {
-    PyObject *objf = objfile_to_objfile_object (obj);
-    if (!objf)
+    gdbpy_ref<> objf = objfile_to_objfile_object (obj);
+    if (objf == NULL)
       {
        /* Ignore the error and continue.  */
        PyErr_Clear ();
        continue;
       }
 
-    gdbpy_ref<> pp_list (objfpy_get_printers (objf, NULL));
+    gdbpy_ref<> pp_list (objfpy_get_printers (objf.get (), NULL));
     gdbpy_ref<> function (search_pp_list (pp_list.get (), value));
 
     /* If there is an error in any objfile list, abort the search and exit.  */
index 3c468475b1594788777e58cb9db2007121ac2b9b..1e16b845e0a5f461ffc696e76b8c94daa2c4a113 100644 (file)
@@ -344,9 +344,10 @@ pspy_get_objfiles (PyObject *self_, PyObject *args)
 
       ALL_PSPACE_OBJFILES (self->pspace, objf)
        {
-         PyObject *item = objfile_to_objfile_object (objf);
+         gdbpy_ref<> item = objfile_to_objfile_object (objf);
 
-         if (!item || PyList_Append (list.get (), item) == -1)
+         if (item == nullptr
+             || PyList_Append (list.get (), item.get ()) == -1)
            return NULL;
        }
     }
index be7fb3ec4717b9d83a18db0187bfd6bff5ebb52f..9bb20dab31fc345295ca7efd31a251b44f18023f 100644 (file)
@@ -117,13 +117,10 @@ static PyObject *
 stpy_get_objfile (PyObject *self, void *closure)
 {
   struct symtab *symtab = NULL;
-  PyObject *result;
 
   STPY_REQUIRE_VALID (self, symtab);
 
-  result = objfile_to_objfile_object (SYMTAB_OBJFILE (symtab));
-  Py_XINCREF (result);
-  return result;
+  return objfile_to_objfile_object (SYMTAB_OBJFILE (symtab)).release ();
 }
 
 /* Getter function for symtab.producer.  */
index c568295a165ebf62061cd1277d7a7d4d9d7a5b0a..8e616cd4e2d6410694e9bf924ca003fbccc3f234 100644 (file)
@@ -147,7 +147,7 @@ gdbpy_get_matching_xmethod_workers
      list individually, but there's no data yet to show it's needed.  */
   ALL_OBJFILES (objfile)
     {
-      PyObject *py_objfile = objfile_to_objfile_object (objfile);
+      gdbpy_ref<> py_objfile = objfile_to_objfile_object (objfile);
 
       if (py_objfile == NULL)
        {
@@ -155,7 +155,8 @@ gdbpy_get_matching_xmethod_workers
          return EXT_LANG_RC_ERROR;
        }
 
-      gdbpy_ref<> objfile_matchers (objfpy_get_xmethods (py_objfile, NULL));
+      gdbpy_ref<> objfile_matchers (objfpy_get_xmethods (py_objfile.get (),
+                                                        NULL));
       gdbpy_ref<> temp (PySequence_Concat (py_xmethod_matcher_list.get (),
                                           objfile_matchers.get ()));
       if (temp == NULL)
index 58baa11ee45d23e253e1e4d0b06a4627e13724df..ad8d33372845337051c7e16da333fdc5315e1b41 100644 (file)
@@ -522,8 +522,7 @@ PyObject *pspy_get_frame_filters (PyObject *, void *);
 PyObject *pspy_get_frame_unwinders (PyObject *, void *);
 PyObject *pspy_get_xmethods (PyObject *, void *);
 
-PyObject *objfile_to_objfile_object (struct objfile *)
-    CPYCHECKER_RETURNS_BORROWED_REF;
+gdbpy_ref<> objfile_to_objfile_object (struct objfile *);
 PyObject *objfpy_get_printers (PyObject *, void *);
 PyObject *objfpy_get_frame_filters (PyObject *, void *);
 PyObject *objfpy_get_frame_unwinders (PyObject *, void *);
index 66b6631f93a33ba9d143466cd01fff96d3a55295..1a0562a22751e05b9591382f7c24b6744bf3b8bf 100644 (file)
@@ -1359,15 +1359,10 @@ gdbpy_execute_objfile_script (const struct extension_language_defn *extlang,
 static PyObject *
 gdbpy_get_current_objfile (PyObject *unused1, PyObject *unused2)
 {
-  PyObject *result;
-
   if (! gdbpy_current_objfile)
     Py_RETURN_NONE;
 
-  result = objfile_to_objfile_object (gdbpy_current_objfile);
-  if (result)
-    Py_INCREF (result);
-  return result;
+  return objfile_to_objfile_object (gdbpy_current_objfile).release ();
 }
 
 /* Compute the list of active python type printers and store them in