diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 1f41498dc83..87e20d3adb4 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2019-03-26 Andrew Burgess + + * python.texi (Pretty Printing API): Document use of None for the + display_hint. + 2019-03-22 Alan Hayward Jiong Wang diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 6fadaffa371..56c925d4dd2 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -1294,7 +1294,7 @@ consumer as a @samp{displayhint} attribute of the variable being printed. This method is optional. If it does exist, this method must return a -string. +string or the special value @code{None}. Some display hints are predefined by @value{GDBN}: @@ -1317,6 +1317,9 @@ string-printing function to format the string. For the CLI this means adding quotation marks, possibly escaping some characters, respecting @code{set print elements}, and the like. @end table + +The special value @code{None} causes @value{GDBN} to apply the default +display rules. @end defun @defun pretty_printer.to_string (self) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 04a90fca41c..e283f68201e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2019-03-26 Andrew Burgess + + * gdb.python/py-prettyprint.c (struct container) : New + field. + (make_container): Initialise new field. + * gdb.python/py-prettyprint.exp: Add new tests. + * gdb.python/py-prettyprint.py (class ContainerPrinter) + : New method. + 2019-03-26 Andrew Burgess * gdb.python/py-prettyprint.exp: Use gdb_breakpoint and diff --git a/gdb/testsuite/gdb.python/py-prettyprint.c b/gdb/testsuite/gdb.python/py-prettyprint.c index 01fdf8a96e6..1b9aeb4b679 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.c +++ b/gdb/testsuite/gdb.python/py-prettyprint.c @@ -175,6 +175,7 @@ struct container string name; int len; int *elements; + int is_map_p; }; typedef struct container zzz_type; @@ -195,6 +196,7 @@ make_container (const char *s) result.name = make_string (s); result.len = 0; result.elements = 0; + result.is_map_p = 0; return result; } diff --git a/gdb/testsuite/gdb.python/py-prettyprint.exp b/gdb/testsuite/gdb.python/py-prettyprint.exp index 335908279c9..82e7e650316 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.exp +++ b/gdb/testsuite/gdb.python/py-prettyprint.exp @@ -109,7 +109,12 @@ proc run_lang_tests {exefile lang} { gdb_test_no_output "set python print-stack full" gdb_test "print hint_error" "Exception: hint failed\r\nhint_error_val" - gdb_test "print c" " = container \"container\" with 2 elements = {$nl *.0. = 23,$nl *.1. = 72$nl}" + gdb_test "print c" " = container \"container\" with 2 elements = {$nl *.0. = 23,$nl *.1. = 72$nl}" \ + "print c, pretty printing on, default display hint" + + gdb_test_no_output "set variable c.is_map_p=1" + gdb_test "print c" " = container \"container\" with 2 elements = \{$nl \\\[23\\\] = 72$nl\}" \ + "print c, pretty printing on, display hint is now map" gdb_test "print nstype" " = {$nl *.0. = 7,$nl *.1. = 42$nl}" @@ -117,6 +122,14 @@ proc run_lang_tests {exefile lang} { gdb_test "print nstype" " = {.0. = 7, .1. = 42}" \ "print nstype on one line" + # Now we have pretty printing turned off, try printing 'c' again. + gdb_test "print c" " = container \"container\" with 2 elements = \{\\\[23\\\] = 72\}" \ + "print c, pretty printing off, display hint is now map" + + gdb_test_no_output "set variable c.is_map_p=0" + gdb_test "print c" " = container \"container\" with 2 elements = \{\\\[0\\\] = 23, \\\[1\\\] = 72\}" \ + "print c, pretty printing off, default display hint" + # Check that GDB doesn't lose typedefs when looking for a printer. gdb_test "print an_int" " = -1" gdb_test "print (int) an_int" " = -1" diff --git a/gdb/testsuite/gdb.python/py-prettyprint.py b/gdb/testsuite/gdb.python/py-prettyprint.py index 92fe81525b1..43727f7231d 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.py +++ b/gdb/testsuite/gdb.python/py-prettyprint.py @@ -56,6 +56,12 @@ class ContainerPrinter (object): def children(self): return _iterator(self.val['elements'], self.val['len']) + def display_hint (self): + if (self.val['is_map_p']): + return 'map' + else: + return None + # Treats a container as array. class ArrayPrinter (object): def __init__(self, val):