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 717d37b..b673acd 100644 (file)
@@ -1,5 +1,23 @@
 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.
        * python/python-internal.h (pspace_to_pspace_object): Change
        return type.
index aa31fb4..55e884d 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 722c9b0..2e24d0f 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 9aadd3b..a706222 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 3c46847..1e16b84 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 be7fb3e..9bb20da 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 c568295..8e616cd 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 58baa11..ad8d333 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 66b6631..1a0562a 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