#ifdef HAVE_PYTHON
#include "python-internal.h"
-
/* Helper function for find_pretty_printer which iterates over a list,
calls each function and inspects output. This will return a
printer object if one recognizes VALUE. If no printer is found, it
will return None. On error, it will set the Python error and
return NULL. */
+
static PyObject *
search_pp_list (PyObject *list, PyObject *value)
{
if (! function)
return NULL;
+ /* Skip if disabled. */
+ if (PyObject_HasAttr (function, gdbpy_enabled_cst)
+ && ! PyObject_IsTrue (PyObject_GetAttr (function, gdbpy_enabled_cst)))
+ continue;
+
printer = PyObject_CallFunctionObjArgs (function, value, NULL);
if (! printer)
return NULL;
Py_RETURN_NONE;
}
-/* Find the pretty-printing constructor function for VALUE. If no
- pretty-printer exists, return None. If one exists, return a new
- reference. On error, set the Python error and return NULL. */
+/* Subroutine of find_pretty_printer to simplify it.
+ Look for a pretty-printer to print VALUE in all objfiles.
+ The result is NULL if there's an error and the search should be terminated.
+ 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 *
-find_pretty_printer (PyObject *value)
+find_pretty_printer_from_objfiles (PyObject *value)
{
- PyObject *pp_list = NULL;
- PyObject *function = NULL;
+ PyObject *pp_list;
+ PyObject *function;
struct objfile *obj;
- volatile struct gdb_exception except;
- /* Look at the pretty-printer dictionary for each objfile. */
ALL_OBJFILES (obj)
{
PyObject *objf = objfile_to_objfile_object (obj);
pp_list = objfpy_get_printers (objf, NULL);
function = search_pp_list (pp_list, 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)
- {
- Py_XDECREF (pp_list);
- return NULL;
- }
+ return NULL;
if (function != Py_None)
- goto done;
+ return function;
Py_DECREF (function);
- Py_XDECREF (pp_list);
}
- pp_list = NULL;
+ Py_RETURN_NONE;
+}
+
+/* Subroutine of find_pretty_printer to simplify it.
+ Look for a pretty-printer to print VALUE in the current program space.
+ The result is NULL if there's an error and the search should be terminated.
+ 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 *
+find_pretty_printer_from_progspace (PyObject *value)
+{
+ PyObject *pp_list;
+ PyObject *function;
+ PyObject *obj = pspace_to_pspace_object (current_program_space);
+
+ if (!obj)
+ return NULL;
+ pp_list = pspy_get_printers (obj, NULL);
+ function = search_pp_list (pp_list, value);
+ Py_XDECREF (pp_list);
+ return function;
+}
+
+/* Subroutine of find_pretty_printer to simplify it.
+ Look for a pretty-printer to print VALUE in the gdb module.
+ The result is NULL if there's an error and the search should be terminated.
+ 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 *
+find_pretty_printer_from_gdb (PyObject *value)
+{
+ PyObject *pp_list;
+ PyObject *function;
+
/* Fetch the global pretty printer dictionary. */
if (! PyObject_HasAttrString (gdb_module, "pretty_printers"))
+ Py_RETURN_NONE;
+ pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers");
+ if (pp_list == NULL || ! PyList_Check (pp_list))
{
- function = Py_None;
- Py_INCREF (function);
- goto done;
+ Py_XDECREF (pp_list);
+ Py_RETURN_NONE;
}
- pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers");
- if (! pp_list)
- goto done;
- if (! PyList_Check (pp_list))
- goto done;
function = search_pp_list (pp_list, value);
-
- done:
Py_XDECREF (pp_list);
-
return function;
}
+/* Find the pretty-printing constructor function for VALUE. If no
+ pretty-printer exists, return None. If one exists, return a new
+ reference. On error, set the Python error and return NULL. */
+
+static PyObject *
+find_pretty_printer (PyObject *value)
+{
+ PyObject *function;
+
+ /* Look at the pretty-printer dictionary for each objfile
+ in the current program-space. */
+ function = find_pretty_printer_from_objfiles (value);
+ if (function == NULL || function != Py_None)
+ return function;
+ Py_DECREF (function);
+
+ /* Look at the pretty-printer dictionary for the current program-space. */
+ function = find_pretty_printer_from_progspace (value);
+ if (function == NULL || function != Py_None)
+ return function;
+ Py_DECREF (function);
+
+ /* Look at the pretty-printer dictionary in the gdb module. */
+ function = find_pretty_printer_from_gdb (value);
+ return function;
+}
/* Pretty-print a single value, via the printer object PRINTER.
If the function returns a string, a PyObject containing the string
{
PyFrameObject *frame = p;
PyThreadState *tstate = PyThreadState_GET ();
+
tstate->frame = frame;
}
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
+ const struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{
valaddr += embedded_offset;
value = value_from_contents_and_address (type, valaddr,
address + embedded_offset);
+ if (val != NULL)
+ {
+ set_value_component_location (value, val);
+ /* set_value_component_location resets the address, so we may
+ need to set it again. */
+ if (VALUE_LVAL (value) != lval_internalvar
+ && VALUE_LVAL (value) != lval_internalvar_component
+ && VALUE_LVAL (value) != lval_computed)
+ set_value_address (value, address + embedded_offset);
+ }
val_obj = value_to_value_object (value);
if (! val_obj)
apply_varobj_pretty_printer (PyObject *printer_obj,
struct value **replacement)
{
- int size = 0;
PyObject *py_str = NULL;
*replacement = NULL;
gdbpy_default_visualizer (PyObject *self, PyObject *args)
{
PyObject *val_obj;
- PyObject *cons, *printer = NULL;
+ PyObject *cons;
struct value *value;
if (! PyArg_ParseTuple (args, "O", &val_obj))
value = value_object_to_value (val_obj);
if (! value)
{
- PyErr_SetString (PyExc_TypeError, "argument must be a gdb.Value");
+ PyErr_SetString (PyExc_TypeError,
+ _("Argument must be a gdb.Value."));
return NULL;
}
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
+ const struct value *val,
const struct value_print_options *options,
const struct language_defn *language)
{