gdb: Make python display_hint None handling defined behaviour
authorAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 21 Mar 2019 16:29:14 +0000 (16:29 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 26 Mar 2019 18:25:10 +0000 (18:25 +0000)
The documentation say that the display_hint method must return a
string to serve as a display hint, and then goes on to list some
acceptable strings.

However, if we don't supply the display_hint method then we get a
default display style behaviour and there's currently no way (in the
python api) to force this default behaviour.

The guile api allows #f to be used in order to force the default
display style behaviour, and this is documented.

Currently, using None in the python api also forces the default
display behaviour.

This commit extends the documentation to make returning None from the
display_hint method an official mechanism by which the user can get
the default display style.

I've extended one of the existing tests to cover this case.

gdb/doc/ChangeLog:

* python.texi (Pretty Printing API): Document use of None for the
display_hint.

gdb/testsuite/ChangeLog:

* gdb.python/py-prettyprint.c (struct container) <is_map_p>: New
field.
(make_container): Initialise new field.
* gdb.python/py-prettyprint.exp: Add new tests.
* gdb.python/py-prettyprint.py (class ContainerPrinter)
<display_hint>: New method.

gdb/doc/ChangeLog
gdb/doc/python.texi
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-prettyprint.c
gdb/testsuite/gdb.python/py-prettyprint.exp
gdb/testsuite/gdb.python/py-prettyprint.py

index 1f41498dc834baf28104cd63cbd67026fa76c532..87e20d3adb4dccd4a6a061836014f3e4aec2ff84 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-26  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * python.texi (Pretty Printing API): Document use of None for the
+       display_hint.
+
 2019-03-22  Alan Hayward  <alan.hayward@arm.com>
            Jiong Wang  <jiong.wang@arm.com>
 
index 6fadaffa37139867a2cadbd511ee268f256ab743..56c925d4dd294333bba7c176657e54dd0dbdece8 100644 (file)
@@ -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)
index 04a90fca41c352547e1e46612229b2798ee81d0e..e283f68201eb37ad88135a84251d7e8fc129399d 100644 (file)
@@ -1,3 +1,12 @@
+2019-03-26  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gdb.python/py-prettyprint.c (struct container) <is_map_p>: New
+       field.
+       (make_container): Initialise new field.
+       * gdb.python/py-prettyprint.exp: Add new tests.
+       * gdb.python/py-prettyprint.py (class ContainerPrinter)
+       <display_hint>: New method.
+
 2019-03-26  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gdb.python/py-prettyprint.exp: Use gdb_breakpoint and
index 01fdf8a96e6ff88a9ffea82feebb51a9ad7d31f7..1b9aeb4b6798e12185cbb1152ba6328256765a2d 100644 (file)
@@ -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;
 }
index 335908279c9ed90630943a2f78b8fb097d57df32..82e7e6503168a683b1758f905e00ce72852613b3 100644 (file)
@@ -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"
index 92fe81525b13261185e62adb26a4e6ee58905ed6..43727f7231d0c46255e91eb226c6115fe3d3e5cc 100644 (file)
@@ -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):
This page took 0.039156 seconds and 4 git commands to generate.