Allow a pretty-printer without a to_string method
PR python/16047 points out that, while the documentation says that the to_string method is optional for a pretty-printer, the code disagrees and throws an exception. This patch fixes the problem. varobj is already ok here. Tested on x86-64 Fedora 26. gdb/ChangeLog 2018-09-08 Tom Tromey <tom@tromey.com> PR python/16047: * python/py-prettyprint.c (pretty_print_one_value): Check for to_string method. gdb/testsuite/ChangeLog 2018-09-08 Tom Tromey <tom@tromey.com> PR python/16047: * gdb.python/py-prettyprint.py (pp_int_typedef3): New class. (register_pretty_printers): Register new printer. * gdb.python/py-prettyprint.exp (run_lang_tests): Add int_type3 test. * gdb.python/py-prettyprint.c (int_type3): New typedef. (an_int_type3): New global.
This commit is contained in:
parent
0653638f9f
commit
332cf4c925
6 changed files with 47 additions and 10 deletions
|
@ -1,3 +1,9 @@
|
|||
2018-09-08 Tom Tromey <tom@tromey.com>
|
||||
|
||||
PR python/16047:
|
||||
* python/py-prettyprint.c (pretty_print_one_value): Check for
|
||||
to_string method.
|
||||
|
||||
2018-09-08 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* ada-lang.c (resolve_subexp): Pass correct OPLEN in call to
|
||||
|
|
|
@ -195,18 +195,23 @@ pretty_print_one_value (PyObject *printer, struct value **out_value)
|
|||
*out_value = NULL;
|
||||
TRY
|
||||
{
|
||||
result.reset (PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst,
|
||||
NULL));
|
||||
if (result != NULL)
|
||||
if (!PyObject_HasAttr (printer, gdbpy_to_string_cst))
|
||||
result = gdbpy_ref<>::new_reference (Py_None);
|
||||
else
|
||||
{
|
||||
if (! gdbpy_is_string (result.get ())
|
||||
&& ! gdbpy_is_lazy_string (result.get ())
|
||||
&& result != Py_None)
|
||||
result.reset (PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst,
|
||||
NULL));
|
||||
if (result != NULL)
|
||||
{
|
||||
*out_value = convert_value_from_python (result.get ());
|
||||
if (PyErr_Occurred ())
|
||||
*out_value = NULL;
|
||||
result = NULL;
|
||||
if (! gdbpy_is_string (result.get ())
|
||||
&& ! gdbpy_is_lazy_string (result.get ())
|
||||
&& result != Py_None)
|
||||
{
|
||||
*out_value = convert_value_from_python (result.get ());
|
||||
if (PyErr_Occurred ())
|
||||
*out_value = NULL;
|
||||
result = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,13 @@
|
|||
2018-09-08 Tom Tromey <tom@tromey.com>
|
||||
|
||||
PR python/16047:
|
||||
* gdb.python/py-prettyprint.py (pp_int_typedef3): New class.
|
||||
(register_pretty_printers): Register new printer.
|
||||
* gdb.python/py-prettyprint.exp (run_lang_tests): Add int_type3
|
||||
test.
|
||||
* gdb.python/py-prettyprint.c (int_type3): New typedef.
|
||||
(an_int_type3): New global.
|
||||
|
||||
2018-09-08 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* gdb.ada/expr_with_funcall: New testcase.
|
||||
|
|
|
@ -271,10 +271,12 @@ bug_14741()
|
|||
when looking for a printer. */
|
||||
typedef int int_type;
|
||||
typedef int_type int_type2;
|
||||
typedef int_type int_type3;
|
||||
|
||||
int an_int = -1;
|
||||
int_type an_int_type = 1;
|
||||
int_type2 an_int_type2 = 2;
|
||||
int_type3 an_int_type3 = 3;
|
||||
|
||||
int
|
||||
main ()
|
||||
|
|
|
@ -127,6 +127,10 @@ proc run_lang_tests {exefile lang} {
|
|||
gdb_test "print (int_type) an_int_type2" " = type=int_type, val=2"
|
||||
gdb_test "print (int_type2) an_int_type2" " = type=int_type2, val=2"
|
||||
|
||||
# PR python/16047: it is ok for a pretty printer not to have a
|
||||
# to_string method.
|
||||
gdb_test "print (int_type3) an_int_type2" " = {s = 27}"
|
||||
|
||||
gdb_continue_to_end
|
||||
}
|
||||
|
||||
|
|
|
@ -253,6 +253,15 @@ class pp_int_typedef (object):
|
|||
def to_string(self):
|
||||
return "type=%s, val=%s" % (self.val.type, int(self.val))
|
||||
|
||||
class pp_int_typedef3 (object):
|
||||
"A printer without a to_string method"
|
||||
|
||||
def __init__(self, val):
|
||||
self.val = val
|
||||
|
||||
def children(self):
|
||||
yield 's', 27
|
||||
|
||||
def lookup_function (val):
|
||||
"Look-up and return a pretty-printer that can print val."
|
||||
|
||||
|
@ -362,6 +371,7 @@ def register_pretty_printers ():
|
|||
|
||||
typedefs_pretty_printers_dict[re.compile ('^int_type$')] = pp_int_typedef
|
||||
typedefs_pretty_printers_dict[re.compile ('^int_type2$')] = pp_int_typedef
|
||||
typedefs_pretty_printers_dict[re.compile ('^int_type3$')] = pp_int_typedef3
|
||||
|
||||
# Dict for struct types with typedefs fully stripped.
|
||||
pretty_printers_dict = {}
|
||||
|
|
Loading…
Add table
Reference in a new issue