summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-09-08 14:40:38 -0600
committerTom Tromey <tom@tromey.com>2018-09-08 20:49:15 -0600
commit332cf4c9251a31f0addc2ce2970c9a8bb0c16f96 (patch)
tree63347831188fef2e0558e93c69cc166c7f14f878
parent0653638f9f0efdb1561db8e2faff2580e09658af (diff)
downloadbinutils-gdb-332cf4c9251a31f0addc2ce2970c9a8bb0c16f96.tar.gz
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.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/python/py-prettyprint.c25
-rw-r--r--gdb/testsuite/ChangeLog10
-rw-r--r--gdb/testsuite/gdb.python/py-prettyprint.c2
-rw-r--r--gdb/testsuite/gdb.python/py-prettyprint.exp4
-rw-r--r--gdb/testsuite/gdb.python/py-prettyprint.py10
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 <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
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 <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.
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 = {}