From 332cf4c9251a31f0addc2ce2970c9a8bb0c16f96 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 8 Sep 2018 14:40:38 -0600 Subject: [PATCH] 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 PR python/16047: * python/py-prettyprint.c (pretty_print_one_value): Check for to_string method. gdb/testsuite/ChangeLog 2018-09-08 Tom Tromey 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. --- gdb/ChangeLog | 6 +++++ gdb/python/py-prettyprint.c | 25 ++++++++++++--------- gdb/testsuite/ChangeLog | 10 +++++++++ gdb/testsuite/gdb.python/py-prettyprint.c | 2 ++ gdb/testsuite/gdb.python/py-prettyprint.exp | 4 ++++ gdb/testsuite/gdb.python/py-prettyprint.py | 10 +++++++++ 6 files changed, 47 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3247b66f6bb..bf5dcbca34a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-09-08 Tom Tromey + + PR python/16047: + * python/py-prettyprint.c (pretty_print_one_value): Check for + to_string method. + 2018-09-08 Joel Brobecker * ada-lang.c (resolve_subexp): Pass correct OPLEN in call to diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index a8a84899309..df0266b2613 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -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; + } } } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 02da57f7872..6403cb8eb69 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2018-09-08 Tom Tromey + + 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 * gdb.ada/expr_with_funcall: New testcase. diff --git a/gdb/testsuite/gdb.python/py-prettyprint.c b/gdb/testsuite/gdb.python/py-prettyprint.c index 35ef5e0756b..ef5b0c3c5ea 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.c +++ b/gdb/testsuite/gdb.python/py-prettyprint.c @@ -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 () diff --git a/gdb/testsuite/gdb.python/py-prettyprint.exp b/gdb/testsuite/gdb.python/py-prettyprint.exp index 2671cb8471b..0508a9718fe 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.exp +++ b/gdb/testsuite/gdb.python/py-prettyprint.exp @@ -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 } diff --git a/gdb/testsuite/gdb.python/py-prettyprint.py b/gdb/testsuite/gdb.python/py-prettyprint.py index 7357f05cc93..91592b4ec79 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.py +++ b/gdb/testsuite/gdb.python/py-prettyprint.py @@ -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 = {} -- 2.30.2