[2/4] Change objfile_to_objfile_object to return a new reference
Commit Message
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
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
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
@@ -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;
@@ -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
@@ -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. */
@@ -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. */
@@ -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)
@@ -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 *);
@@ -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;
}