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:
parent
1bb44c9f56
commit
0700aea50c
2 changed files with 41 additions and 62 deletions
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue