aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2021-03-02 14:19:56 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-03-26 17:43:14 +0000
commitb1f3973b9c55a1406c13ade5cb14239d5b17a465 (patch)
tree39fbe51feb95f05ae16b74796e617163d8616200 /gdb
parentb4b1a226df8d51da9594200ad803ad303c15cd36 (diff)
downloadgdb-b1f3973b9c55a1406c13ade5cb14239d5b17a465.zip
gdb-b1f3973b9c55a1406c13ade5cb14239d5b17a465.tar.gz
gdb-b1f3973b9c55a1406c13ade5cb14239d5b17a465.tar.bz2
gdb/testsuite: more testing of pretty printer 'array' display_hint
This commit adds a couple of tests to the python pretty printer testing. I've added a test for the 'array' display hint. This display hint is tested by gdb.python/py-mi.exp, however, the MI testing is done via the varobj interface, and this code makes its own direct calls to the Python pretty printers from gdb/varobj.c. What this means is that the interface to the pretty printers in gdb/python/py-prettyprint.c is not tested for the 'array' display hint path. I also added a test for what happens when the display_hint method raises an exception. There wasn't a bug that inspired this test, just while adding the previous test I thought, I wonder what happens if... The current behaviour of GDB seems reasonable, GDB displays the Python exception, and then continues printing the value as if display_hint had returned None. I added a test to lock in this behaviour. gdb/testsuite/ChangeLog: * gdb.python/py-prettyprint.c (struct container): Add 'is_array_p' member. (make_container): Initialise is_array_p. * gdb.python/py-prettyprint.exp: Add new tests. * gdb.python/py-prettyprint.py (ContainerPrinter.display_hint): Check is_array_p and possibly return 'array'.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/testsuite/ChangeLog9
-rw-r--r--gdb/testsuite/gdb.python/py-prettyprint.c2
-rw-r--r--gdb/testsuite/gdb.python/py-prettyprint.exp29
-rw-r--r--gdb/testsuite/gdb.python/py-prettyprint.py5
4 files changed, 45 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index d0fce59..3484004 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,14 @@
2021-03-26 Andrew Burgess <andrew.burgess@embecosm.com>
+ * gdb.python/py-prettyprint.c (struct container): Add 'is_array_p'
+ member.
+ (make_container): Initialise is_array_p.
+ * gdb.python/py-prettyprint.exp: Add new tests.
+ * gdb.python/py-prettyprint.py (ContainerPrinter.display_hint):
+ Check is_array_p and possibly return 'array'.
+
+2021-03-26 Andrew Burgess <andrew.burgess@embecosm.com>
+
* gdb.cp/breakpoint.exp: Extend test names to make them unique.
* gdb.cp/casts.exp: Give tests unique names.
* gdb.cp/filename.exp: Likewise.
diff --git a/gdb/testsuite/gdb.python/py-prettyprint.c b/gdb/testsuite/gdb.python/py-prettyprint.c
index 2558e98..126537f 100644
--- a/gdb/testsuite/gdb.python/py-prettyprint.c
+++ b/gdb/testsuite/gdb.python/py-prettyprint.c
@@ -176,6 +176,7 @@ struct container
int len;
int *elements;
int is_map_p;
+ int is_array_p;
};
typedef struct container zzz_type;
@@ -197,6 +198,7 @@ make_container (const char *s)
result.len = 0;
result.elements = 0;
result.is_map_p = 0;
+ result.is_array_p = 0;
return result;
}
diff --git a/gdb/testsuite/gdb.python/py-prettyprint.exp b/gdb/testsuite/gdb.python/py-prettyprint.exp
index 9f0b36a..6a3968f 100644
--- a/gdb/testsuite/gdb.python/py-prettyprint.exp
+++ b/gdb/testsuite/gdb.python/py-prettyprint.exp
@@ -112,7 +112,36 @@ proc run_lang_tests {exefile lang} {
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_array_p=1"
+ gdb_test "print c" " = container \"container\" with 2 elements = \\{23, 72\\}" \
+ "print c, pretty printing on, display hint is now array"
+
+ # Setting is_map_p while _is_array_p is also set will cause the
+ # display_hint method to raise an exception (see py-prettyprint.py).
gdb_test_no_output "set variable c.is_map_p=1"
+
+ # This test checks what happens when the display hint throws an
+ # error. GDB just treats this as though the display hint was
+ # None.
+ set py_exception \
+ [multi_line \
+ "Traceback\[^\r\n\]+" \
+ "\\s+File \"\[^\r\n\]+/py-prettyprint.py\", line \[0-9\]+, in display_hint" \
+ "\\s+raise Exception \[^\r\n\]+" \
+ "Exception: invalid object state found in display_hint"]
+ gdb_test "print c" \
+ [multi_line \
+ " = ${py_exception}" \
+ "container \"container\" with 2 elements = {" \
+ "\\s+\\\[0\\\] = 23," \
+ "\\s+\\\[1\\\] = 72" \
+ "}"] \
+ "print c, pretty printing on, exception raised from display_hint"
+
+ # Unset is_array_p so that display_hint no longer raises an
+ # exception.
+ gdb_test_no_output "set variable c.is_array_p=0"
+
gdb_test "print c" " = container \"container\" with 2 elements = \{$nl \\\[23\\\] = 72$nl\}" \
"print c, pretty printing on, display hint is now map"
diff --git a/gdb/testsuite/gdb.python/py-prettyprint.py b/gdb/testsuite/gdb.python/py-prettyprint.py
index 5f09ea8..fab03a6 100644
--- a/gdb/testsuite/gdb.python/py-prettyprint.py
+++ b/gdb/testsuite/gdb.python/py-prettyprint.py
@@ -57,8 +57,13 @@ class ContainerPrinter (object):
return _iterator(self.val['elements'], self.val['len'])
def display_hint (self):
+ if (self.val['is_map_p'] and self.val['is_array_p']):
+ raise Exception ("invalid object state found in display_hint")
+
if (self.val['is_map_p']):
return 'map'
+ elif (self.val['is_array_p']):
+ return 'array'
else:
return None