Return gdbpy_ref from gdbpy_get_varobj_pretty_printer

This changes gdbpy_get_varobj_pretty_printer to return a gdbpy_ref.

gdb/ChangeLog
2018-11-04  Tom Tromey  <tom@tromey.com>

	* varobj.c (install_default_visualizer): Update.
	* python/python-internal.h (gdbpy_get_varobj_pretty_printer):
	Return gdbpy_ref.
	* python/py-prettyprint.c (search_pp_list): Return gdbpy_ref.
	(find_pretty_printer_from_progspace)
	(find_pretty_printer_from_gdb, find_pretty_printer)
	(gdbpy_get_varobj_pretty_printer): Return gdbpy_ref.
	(gdbpy_get_varobj_pretty_printer, gdbpy_default_visualizer):
	Update.
This commit is contained in:
Tom Tromey 2018-10-24 16:45:41 -06:00
parent 833d985d1c
commit a31abe80ea
4 changed files with 31 additions and 24 deletions

View File

@ -1,3 +1,15 @@
2018-11-04 Tom Tromey <tom@tromey.com>
* varobj.c (install_default_visualizer): Update.
* python/python-internal.h (gdbpy_get_varobj_pretty_printer):
Return gdbpy_ref.
* python/py-prettyprint.c (search_pp_list): Return gdbpy_ref.
(find_pretty_printer_from_progspace)
(find_pretty_printer_from_gdb, find_pretty_printer)
(gdbpy_get_varobj_pretty_printer): Return gdbpy_ref.
(gdbpy_get_varobj_pretty_printer, gdbpy_default_visualizer):
Update.
2018-11-04 Tom Tromey <tom@tromey.com> 2018-11-04 Tom Tromey <tom@tromey.com>
* python/python.c (gdbpy_parameter_value): Update. * python/python.c (gdbpy_parameter_value): Update.

View File

@ -45,7 +45,7 @@ enum string_repr_result
will return None. On error, it will set the Python error and will return None. On error, it will set the Python error and
return NULL. */ return NULL. */
static PyObject * static gdbpy_ref<>
search_pp_list (PyObject *list, PyObject *value) search_pp_list (PyObject *list, PyObject *value)
{ {
Py_ssize_t pp_list_size, list_index; Py_ssize_t pp_list_size, list_index;
@ -78,10 +78,10 @@ search_pp_list (PyObject *list, PyObject *value)
if (printer == NULL) if (printer == NULL)
return NULL; return NULL;
else if (printer != Py_None) else if (printer != Py_None)
return printer.release (); return printer;
} }
Py_RETURN_NONE; return gdbpy_ref<>::new_reference (Py_None);
} }
/* Subroutine of find_pretty_printer to simplify it. /* Subroutine of find_pretty_printer to simplify it.
@ -125,7 +125,7 @@ find_pretty_printer_from_objfiles (PyObject *value)
The result is Py_None, suitably inc-ref'd, if no pretty-printer was found. The result is Py_None, suitably inc-ref'd, if no pretty-printer was found.
Otherwise the result is the pretty-printer function, suitably inc-ref'd. */ Otherwise the result is the pretty-printer function, suitably inc-ref'd. */
static PyObject * static gdbpy_ref<>
find_pretty_printer_from_progspace (PyObject *value) find_pretty_printer_from_progspace (PyObject *value)
{ {
gdbpy_ref<> obj = pspace_to_pspace_object (current_program_space); gdbpy_ref<> obj = pspace_to_pspace_object (current_program_space);
@ -142,17 +142,17 @@ find_pretty_printer_from_progspace (PyObject *value)
The result is Py_None, suitably inc-ref'd, if no pretty-printer was found. The result is Py_None, suitably inc-ref'd, if no pretty-printer was found.
Otherwise the result is the pretty-printer function, suitably inc-ref'd. */ Otherwise the result is the pretty-printer function, suitably inc-ref'd. */
static PyObject * static gdbpy_ref<>
find_pretty_printer_from_gdb (PyObject *value) find_pretty_printer_from_gdb (PyObject *value)
{ {
/* Fetch the global pretty printer list. */ /* Fetch the global pretty printer list. */
if (gdb_python_module == NULL if (gdb_python_module == NULL
|| ! PyObject_HasAttrString (gdb_python_module, "pretty_printers")) || ! PyObject_HasAttrString (gdb_python_module, "pretty_printers"))
Py_RETURN_NONE; return gdbpy_ref<>::new_reference (Py_None);
gdbpy_ref<> pp_list (PyObject_GetAttrString (gdb_python_module, gdbpy_ref<> pp_list (PyObject_GetAttrString (gdb_python_module,
"pretty_printers")); "pretty_printers"));
if (pp_list == NULL || ! PyList_Check (pp_list.get ())) if (pp_list == NULL || ! PyList_Check (pp_list.get ()))
Py_RETURN_NONE; return gdbpy_ref<>::new_reference (Py_None);
return search_pp_list (pp_list.get (), value); return search_pp_list (pp_list.get (), value);
} }
@ -161,19 +161,19 @@ find_pretty_printer_from_gdb (PyObject *value)
pretty-printer exists, return None. If one exists, return a new pretty-printer exists, return None. If one exists, return a new
reference. On error, set the Python error and return NULL. */ reference. On error, set the Python error and return NULL. */
static PyObject * static gdbpy_ref<>
find_pretty_printer (PyObject *value) find_pretty_printer (PyObject *value)
{ {
/* Look at the pretty-printer list for each objfile /* Look at the pretty-printer list for each objfile
in the current program-space. */ in the current program-space. */
gdbpy_ref<> function (find_pretty_printer_from_objfiles (value)); gdbpy_ref<> function (find_pretty_printer_from_objfiles (value));
if (function == NULL || function != Py_None) if (function == NULL || function != Py_None)
return function.release (); return function;
/* Look at the pretty-printer list for the current program-space. */ /* Look at the pretty-printer list for the current program-space. */
function.reset (find_pretty_printer_from_progspace (value)); function = find_pretty_printer_from_progspace (value);
if (function == NULL || function != Py_None) if (function == NULL || function != Py_None)
return function.release (); return function;
/* Look at the pretty-printer list in the gdb module. */ /* Look at the pretty-printer list in the gdb module. */
return find_pretty_printer_from_gdb (value); return find_pretty_printer_from_gdb (value);
@ -744,7 +744,7 @@ apply_varobj_pretty_printer (PyObject *printer_obj,
reference to the object if successful; returns NULL if not. VALUE reference to the object if successful; returns NULL if not. VALUE
is the value for which a printer tests to determine if it is the value for which a printer tests to determine if it
can pretty-print the value. */ can pretty-print the value. */
PyObject * gdbpy_ref<>
gdbpy_get_varobj_pretty_printer (struct value *value) gdbpy_get_varobj_pretty_printer (struct value *value)
{ {
TRY TRY
@ -772,7 +772,6 @@ PyObject *
gdbpy_default_visualizer (PyObject *self, PyObject *args) gdbpy_default_visualizer (PyObject *self, PyObject *args)
{ {
PyObject *val_obj; PyObject *val_obj;
PyObject *cons;
struct value *value; struct value *value;
if (! PyArg_ParseTuple (args, "O", &val_obj)) if (! PyArg_ParseTuple (args, "O", &val_obj))
@ -785,6 +784,5 @@ gdbpy_default_visualizer (PyObject *self, PyObject *args)
return NULL; return NULL;
} }
cons = find_pretty_printer (val_obj); return find_pretty_printer (val_obj).release ();
return cons;
} }

View File

@ -680,7 +680,7 @@ int gdbpy_is_value_object (PyObject *obj);
gdbpy_ref<> apply_varobj_pretty_printer (PyObject *print_obj, gdbpy_ref<> apply_varobj_pretty_printer (PyObject *print_obj,
struct value **replacement, struct value **replacement,
struct ui_file *stream); struct ui_file *stream);
PyObject *gdbpy_get_varobj_pretty_printer (struct value *value); gdbpy_ref<> gdbpy_get_varobj_pretty_printer (struct value *value);
gdb::unique_xmalloc_ptr<char> gdbpy_get_display_hint (PyObject *printer); gdb::unique_xmalloc_ptr<char> gdbpy_get_display_hint (PyObject *printer);
PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args); PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args);

View File

@ -1115,25 +1115,22 @@ install_default_visualizer (struct varobj *var)
if (pretty_printing) if (pretty_printing)
{ {
PyObject *pretty_printer = NULL; gdbpy_ref<> pretty_printer;
if (var->value != nullptr) if (var->value != nullptr)
{ {
pretty_printer = gdbpy_get_varobj_pretty_printer (var->value.get ()); pretty_printer = gdbpy_get_varobj_pretty_printer (var->value.get ());
if (! pretty_printer) if (pretty_printer == nullptr)
{ {
gdbpy_print_stack (); gdbpy_print_stack ();
error (_("Cannot instantiate printer for default visualizer")); error (_("Cannot instantiate printer for default visualizer"));
} }
} }
if (pretty_printer == Py_None) if (pretty_printer == Py_None)
{ pretty_printer.release ();
Py_DECREF (pretty_printer);
pretty_printer = NULL;
}
install_visualizer (var->dynamic, NULL, pretty_printer); install_visualizer (var->dynamic, NULL, pretty_printer.release ());
} }
} }