Use gdbpy_ref in py-prettyprint.c

This changes several functions in py-prettyprint.c to use
gdbpy_ref.

2017-01-10  Tom Tromey  <tom@tromey.com>

	* python/py-prettyprint.c (search_pp_list)
	(find_pretty_printer_from_objfiles)
	(find_pretty_printer_from_progspace)
	(find_pretty_printer_from_gdb, find_pretty_printer)
	(gdbpy_get_display_hint, gdbpy_get_varobj_pretty_printer): Use
	gdbpy_ref.
This commit is contained in:
Tom Tromey 2016-11-06 21:37:01 -07:00
parent 1bb44c9f56
commit 0700aea50c
2 changed files with 41 additions and 62 deletions

View file

@ -1,3 +1,12 @@
2017-01-10 Tom Tromey <tom@tromey.com>
* python/py-prettyprint.c (search_pp_list)
(find_pretty_printer_from_objfiles)
(find_pretty_printer_from_progspace)
(find_pretty_printer_from_gdb, find_pretty_printer)
(gdbpy_get_display_hint, gdbpy_get_varobj_pretty_printer): Use
gdbpy_ref.
2017-01-10 Tom Tromey <tom@tromey.com> 2017-01-10 Tom Tromey <tom@tromey.com>
* python/py-param.c (call_doc_function): Use gdbpy_ref. * python/py-param.c (call_doc_function): Use gdbpy_ref.

View file

@ -25,6 +25,7 @@
#include "extension-priv.h" #include "extension-priv.h"
#include "python.h" #include "python.h"
#include "python-internal.h" #include "python-internal.h"
#include "py-ref.h"
/* Return type of print_string_repr. */ /* Return type of print_string_repr. */
@ -48,25 +49,23 @@ static PyObject *
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;
PyObject *function, *printer = NULL;
pp_list_size = PyList_Size (list); pp_list_size = PyList_Size (list);
for (list_index = 0; list_index < pp_list_size; list_index++) for (list_index = 0; list_index < pp_list_size; list_index++)
{ {
function = PyList_GetItem (list, list_index); PyObject *function = PyList_GetItem (list, list_index);
if (! function) if (! function)
return NULL; return NULL;
/* Skip if disabled. */ /* Skip if disabled. */
if (PyObject_HasAttr (function, gdbpy_enabled_cst)) if (PyObject_HasAttr (function, gdbpy_enabled_cst))
{ {
PyObject *attr = PyObject_GetAttr (function, gdbpy_enabled_cst); gdbpy_ref attr (PyObject_GetAttr (function, gdbpy_enabled_cst));
int cmp; int cmp;
if (!attr) if (attr == NULL)
return NULL; return NULL;
cmp = PyObject_IsTrue (attr); cmp = PyObject_IsTrue (attr.get ());
Py_DECREF (attr);
if (cmp == -1) if (cmp == -1)
return NULL; return NULL;
@ -74,13 +73,11 @@ search_pp_list (PyObject *list, PyObject *value)
continue; continue;
} }
printer = PyObject_CallFunctionObjArgs (function, value, NULL); gdbpy_ref printer (PyObject_CallFunctionObjArgs (function, value, NULL));
if (! printer) if (printer == NULL)
return NULL; return NULL;
else if (printer != Py_None) else if (printer != Py_None)
return printer; return printer.release ();
Py_DECREF (printer);
} }
Py_RETURN_NONE; Py_RETURN_NONE;
@ -95,8 +92,6 @@ search_pp_list (PyObject *list, PyObject *value)
static PyObject * static PyObject *
find_pretty_printer_from_objfiles (PyObject *value) find_pretty_printer_from_objfiles (PyObject *value)
{ {
PyObject *pp_list;
PyObject *function;
struct objfile *obj; struct objfile *obj;
ALL_OBJFILES (obj) ALL_OBJFILES (obj)
@ -109,18 +104,15 @@ find_pretty_printer_from_objfiles (PyObject *value)
continue; continue;
} }
pp_list = objfpy_get_printers (objf, NULL); gdbpy_ref pp_list (objfpy_get_printers (objf, NULL));
function = search_pp_list (pp_list, value); gdbpy_ref function (search_pp_list (pp_list.get (), value));
Py_XDECREF (pp_list);
/* If there is an error in any objfile list, abort the search and exit. */ /* If there is an error in any objfile list, abort the search and exit. */
if (! function) if (function == NULL)
return NULL; return NULL;
if (function != Py_None) if (function != Py_None)
return function; return function.release ();
Py_DECREF (function);
} }
Py_RETURN_NONE; Py_RETURN_NONE;
@ -135,16 +127,12 @@ find_pretty_printer_from_objfiles (PyObject *value)
static PyObject * static PyObject *
find_pretty_printer_from_progspace (PyObject *value) find_pretty_printer_from_progspace (PyObject *value)
{ {
PyObject *pp_list;
PyObject *function;
PyObject *obj = pspace_to_pspace_object (current_program_space); PyObject *obj = pspace_to_pspace_object (current_program_space);
if (!obj) if (!obj)
return NULL; return NULL;
pp_list = pspy_get_printers (obj, NULL); gdbpy_ref pp_list (pspy_get_printers (obj, NULL));
function = search_pp_list (pp_list, value); return search_pp_list (pp_list.get (), value);
Py_XDECREF (pp_list);
return function;
} }
/* Subroutine of find_pretty_printer to simplify it. /* Subroutine of find_pretty_printer to simplify it.
@ -156,23 +144,16 @@ find_pretty_printer_from_progspace (PyObject *value)
static PyObject * static PyObject *
find_pretty_printer_from_gdb (PyObject *value) find_pretty_printer_from_gdb (PyObject *value)
{ {
PyObject *pp_list;
PyObject *function;
/* 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; Py_RETURN_NONE;
pp_list = PyObject_GetAttrString (gdb_python_module, "pretty_printers"); gdbpy_ref pp_list (PyObject_GetAttrString (gdb_python_module,
if (pp_list == NULL || ! PyList_Check (pp_list)) "pretty_printers"));
{ if (pp_list == NULL || ! PyList_Check (pp_list.get ()))
Py_XDECREF (pp_list); Py_RETURN_NONE;
Py_RETURN_NONE;
}
function = search_pp_list (pp_list, value); return search_pp_list (pp_list.get (), value);
Py_XDECREF (pp_list);
return function;
} }
/* Find the pretty-printing constructor function for VALUE. If no /* Find the pretty-printing constructor function for VALUE. If no
@ -182,24 +163,19 @@ find_pretty_printer_from_gdb (PyObject *value)
static PyObject * static PyObject *
find_pretty_printer (PyObject *value) find_pretty_printer (PyObject *value)
{ {
PyObject *function;
/* 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. */
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; return function.release ();
Py_DECREF (function);
/* Look at the pretty-printer list for the current program-space. */ /* Look at the pretty-printer list for the current program-space. */
function = find_pretty_printer_from_progspace (value); function.reset (find_pretty_printer_from_progspace (value));
if (function == NULL || function != Py_None) if (function == NULL || function != Py_None)
return function; return function.release ();
Py_DECREF (function);
/* Look at the pretty-printer list in the gdb module. */ /* Look at the pretty-printer list in the gdb module. */
function = find_pretty_printer_from_gdb (value); return find_pretty_printer_from_gdb (value);
return function;
} }
/* Pretty-print a single value, via the printer object PRINTER. /* Pretty-print a single value, via the printer object PRINTER.
@ -247,22 +223,21 @@ pretty_print_one_value (PyObject *printer, struct value **out_value)
gdb::unique_xmalloc_ptr<char> gdb::unique_xmalloc_ptr<char>
gdbpy_get_display_hint (PyObject *printer) gdbpy_get_display_hint (PyObject *printer)
{ {
PyObject *hint;
gdb::unique_xmalloc_ptr<char> result; gdb::unique_xmalloc_ptr<char> result;
if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst)) if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst))
return NULL; return NULL;
hint = PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst, NULL); gdbpy_ref hint (PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst,
if (hint) NULL));
if (hint != NULL)
{ {
if (gdbpy_is_string (hint)) if (gdbpy_is_string (hint.get ()))
{ {
result = python_string_to_host_string (hint); result = python_string_to_host_string (hint.get ());
if (result == NULL) if (result == NULL)
gdbpy_print_stack (); gdbpy_print_stack ();
} }
Py_DECREF (hint);
} }
else else
gdbpy_print_stack (); gdbpy_print_stack ();
@ -804,9 +779,6 @@ apply_varobj_pretty_printer (PyObject *printer_obj,
PyObject * PyObject *
gdbpy_get_varobj_pretty_printer (struct value *value) gdbpy_get_varobj_pretty_printer (struct value *value)
{ {
PyObject *val_obj;
PyObject *pretty_printer = NULL;
TRY TRY
{ {
value = value_copy (value); value = value_copy (value);
@ -817,13 +789,11 @@ gdbpy_get_varobj_pretty_printer (struct value *value)
} }
END_CATCH END_CATCH
val_obj = value_to_value_object (value); gdbpy_ref val_obj (value_to_value_object (value));
if (! val_obj) if (val_obj == NULL)
return NULL; return NULL;
pretty_printer = find_pretty_printer (val_obj); return find_pretty_printer (val_obj.get ());
Py_DECREF (val_obj);
return pretty_printer;
} }
/* A Python function which wraps find_pretty_printer and instantiates /* A Python function which wraps find_pretty_printer and instantiates