[2/4] Change objfile_to_objfile_object to return a new reference

Message ID 20180913053007.11780-3-tom@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey Sept. 13, 2018, 5:30 a.m. UTC
  This changes objfile_to_objfile_object to return a new references and
fixes up all the uses.

2018-09-12  Tom Tromey  <tom@tromey.com>

	* 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                   | 17 +++++++++++++
 gdb/python/py-newobjfileevent.c | 10 +++-----
 gdb/python/py-objfile.c         | 43 +++++++++++++--------------------
 gdb/python/py-prettyprint.c     |  6 ++---
 gdb/python/py-symtab.c          |  5 +---
 gdb/python/py-xmethods.c        |  5 ++--
 gdb/python/python-internal.h    |  3 +--
 gdb/python/python.c             | 11 +++------
 8 files changed, 49 insertions(+), 51 deletions(-)
  

Comments

Simon Marchi Sept. 16, 2018, 1:28 a.m. UTC | #1
On 2018-09-13 1:30 a.m., Tom Tromey wrote:
> This changes objfile_to_objfile_object to return a new references and
> fixes up all the uses.
> 
> 2018-09-12  Tom Tromey  <tom@tromey.com>
> 
> 	* 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.

I'm also getting some failures with this patch;

  CXX    python/python.o
/home/simark/src/binutils-gdb/gdb/python/python.c:1432:12: error: assigning to 'PyObject *' (aka '_object *') from incompatible type 'gdbpy_ref<>' (aka 'gdb::ref_ptr<_object, gdbpy_ref_policy<_object> >')
  result = objfile_to_objfile_object (gdbpy_current_objfile);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/simark/src/binutils-gdb/gdb/python/python.c:1451:17: error: no viable conversion from 'gdbpy_ref<>' (aka 'gdb::ref_ptr<_object, gdbpy_ref_policy<_object> >') to 'PyObject *' (aka '_object *')
      PyObject *item = objfile_to_objfile_object (objf);
                ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The rest of the changes looks good to me.

Simon
  
Simon Marchi Sept. 16, 2018, 1:59 a.m. UTC | #2
On 2018-09-15 9:28 p.m., Simon Marchi wrote:
> On 2018-09-13 1:30 a.m., Tom Tromey wrote:
>> This changes objfile_to_objfile_object to return a new references and
>> fixes up all the uses.
>>
>> 2018-09-12  Tom Tromey  <tom@tromey.com>
>>
>> 	* 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.
> 
> I'm also getting some failures with this patch;
> 
>   CXX    python/python.o
> /home/simark/src/binutils-gdb/gdb/python/python.c:1432:12: error: assigning to 'PyObject *' (aka '_object *') from incompatible type 'gdbpy_ref<>' (aka 'gdb::ref_ptr<_object, gdbpy_ref_policy<_object> >')
>   result = objfile_to_objfile_object (gdbpy_current_objfile);
>            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> /home/simark/src/binutils-gdb/gdb/python/python.c:1451:17: error: no viable conversion from 'gdbpy_ref<>' (aka 'gdb::ref_ptr<_object, gdbpy_ref_policy<_object> >') to 'PyObject *' (aka '_object *')
>       PyObject *item = objfile_to_objfile_object (objf);
>                 ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Forget about this failure.  I had trouble applying the patches (finding
the right base commit) and managed to get rid of the changes in that file
when dealing with the conflicts.  Everything looks fine here.

Simon
  

Patch

diff --git a/gdb/python/py-newobjfileevent.c b/gdb/python/py-newobjfileevent.c
index aa31fb4849b..55e884dcaf5 100644
--- a/gdb/python/py-newobjfileevent.c
+++ b/gdb/python/py-newobjfileevent.c
@@ -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;
diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
index 8fd160c7bf8..cef34f1bcc2 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -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;
 }
 
@@ -590,12 +585,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;
@@ -613,30 +603,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
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c
index 9aadd3b27c9..a7062225816 100644
--- a/gdb/python/py-prettyprint.c
+++ b/gdb/python/py-prettyprint.c
@@ -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.  */
diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c
index be7fb3ec471..9bb20dab31f 100644
--- a/gdb/python/py-symtab.c
+++ b/gdb/python/py-symtab.c
@@ -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.  */
diff --git a/gdb/python/py-xmethods.c b/gdb/python/py-xmethods.c
index c568295a165..8e616cd4e2d 100644
--- a/gdb/python/py-xmethods.c
+++ b/gdb/python/py-xmethods.c
@@ -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)
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index a6dc5f090b5..cbba3ff8ef6 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -523,8 +523,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 *);
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 93d6d1156d8..778ddb9f342 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -1421,15 +1421,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 ();
 }
 
 /* Return a sequence holding all the Objfiles.  */
@@ -1445,9 +1440,9 @@  gdbpy_objfiles (PyObject *unused1, PyObject *unused2)
 
   ALL_OBJFILES (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 == NULL || PyList_Append (list.get (), item.get ()) == -1)
       return NULL;
   }