From a31abe80ea4c45b544f3ae04bc63ccaeba530e0f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 24 Oct 2018 16:45:41 -0600 Subject: [PATCH] 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 * 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. --- gdb/ChangeLog | 12 ++++++++++++ gdb/python/py-prettyprint.c | 28 +++++++++++++--------------- gdb/python/python-internal.h | 2 +- gdb/varobj.c | 13 +++++-------- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 42b1d7f..bc77fe8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2018-11-04 Tom Tromey + * 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 + * python/python.c (gdbpy_parameter_value): Update. * python/python-internal.h (python_string_to_unicode) (python_string_to_target_python_string) diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index 2386dcc..fa4107c 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -45,7 +45,7 @@ enum string_repr_result will return None. On error, it will set the Python error and return NULL. */ -static PyObject * +static gdbpy_ref<> search_pp_list (PyObject *list, PyObject *value) { Py_ssize_t pp_list_size, list_index; @@ -78,10 +78,10 @@ search_pp_list (PyObject *list, PyObject *value) if (printer == NULL) return NULL; 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. @@ -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. Otherwise the result is the pretty-printer function, suitably inc-ref'd. */ -static PyObject * +static gdbpy_ref<> find_pretty_printer_from_progspace (PyObject *value) { 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. Otherwise the result is the pretty-printer function, suitably inc-ref'd. */ -static PyObject * +static gdbpy_ref<> find_pretty_printer_from_gdb (PyObject *value) { /* Fetch the global pretty printer list. */ if (gdb_python_module == NULL || ! 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, "pretty_printers")); 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); } @@ -161,19 +161,19 @@ find_pretty_printer_from_gdb (PyObject *value) pretty-printer exists, return None. If one exists, return a new reference. On error, set the Python error and return NULL. */ -static PyObject * +static gdbpy_ref<> find_pretty_printer (PyObject *value) { /* Look at the pretty-printer list for each objfile in the current program-space. */ gdbpy_ref<> function (find_pretty_printer_from_objfiles (value)); if (function == NULL || function != Py_None) - return function.release (); + return function; /* 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) - return function.release (); + return function; /* Look at the pretty-printer list in the gdb module. */ 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 is the value for which a printer tests to determine if it can pretty-print the value. */ -PyObject * +gdbpy_ref<> gdbpy_get_varobj_pretty_printer (struct value *value) { TRY @@ -772,7 +772,6 @@ PyObject * gdbpy_default_visualizer (PyObject *self, PyObject *args) { PyObject *val_obj; - PyObject *cons; struct value *value; if (! PyArg_ParseTuple (args, "O", &val_obj)) @@ -785,6 +784,5 @@ gdbpy_default_visualizer (PyObject *self, PyObject *args) return NULL; } - cons = find_pretty_printer (val_obj); - return cons; + return find_pretty_printer (val_obj).release (); } diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 582044a..1ac54f9 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -680,7 +680,7 @@ int gdbpy_is_value_object (PyObject *obj); gdbpy_ref<> apply_varobj_pretty_printer (PyObject *print_obj, struct value **replacement, 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 gdbpy_get_display_hint (PyObject *printer); PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args); diff --git a/gdb/varobj.c b/gdb/varobj.c index 3ae4de8..17cfe4b 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -1115,25 +1115,22 @@ install_default_visualizer (struct varobj *var) if (pretty_printing) { - PyObject *pretty_printer = NULL; + gdbpy_ref<> pretty_printer; if (var->value != nullptr) { pretty_printer = gdbpy_get_varobj_pretty_printer (var->value.get ()); - if (! pretty_printer) + if (pretty_printer == nullptr) { gdbpy_print_stack (); error (_("Cannot instantiate printer for default visualizer")); } } - + if (pretty_printer == Py_None) - { - Py_DECREF (pretty_printer); - pretty_printer = NULL; - } + pretty_printer.release (); - install_visualizer (var->dynamic, NULL, pretty_printer); + install_visualizer (var->dynamic, NULL, pretty_printer.release ()); } } -- 2.7.4