aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.python/py-bad-printers.py
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2015-04-28 21:53:54 -0700
committerDoug Evans <dje@google.com>2015-04-28 21:53:54 -0700
commit69b4374a87e5029ac4831c7a4471815514df662f (patch)
tree9041be61ebe1e1bd8df326650dd946102f15ae77 /gdb/testsuite/gdb.python/py-bad-printers.py
parent5e7cf0784c9b543b1870b974a78244c40105c523 (diff)
downloadgdb-69b4374a87e5029ac4831c7a4471815514df662f.zip
gdb-69b4374a87e5029ac4831c7a4471815514df662f.tar.gz
gdb-69b4374a87e5029ac4831c7a4471815514df662f.tar.bz2
PR python/18089
gdb/ChangeLog: PR python/18089 * python/py-prettyprint.c (print_children): Verify result of children iterator. Provide better error message. * python/python-internal..h (gdbpy_print_python_errors_p): Declare. * python/python.c (gdbpy_print_python_errors_p): New function. gdb/testsuite/ChangeLog: * gdb.python/py-bad-printers.c: New file. * gdb.python/py-bad-printers.py: New file. * gdb.python/py-bad-printers.exp: New file.
Diffstat (limited to 'gdb/testsuite/gdb.python/py-bad-printers.py')
-rw-r--r--gdb/testsuite/gdb.python/py-bad-printers.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.python/py-bad-printers.py b/gdb/testsuite/gdb.python/py-bad-printers.py
new file mode 100644
index 0000000..37c818b
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-bad-printers.py
@@ -0,0 +1,80 @@
+# Copyright (C) 2008-2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the GDB testsuite. It tests GDB's handling of
+# bad python pretty printers.
+
+# Test a printer with a bad children iterator.
+
+import re
+import gdb.printing
+
+
+class BadChildrenContainerPrinter1(object):
+ """Children iterator doesn't return a tuple of two elements."""
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ return 'container %s with %d elements' % (self.val['name'], self.val['len'])
+
+ @staticmethod
+ def _bad_iterator(pointer, len):
+ start = pointer
+ end = pointer + len
+ while pointer != end:
+ yield 'intentional violation of children iterator protocol'
+ pointer += 1
+
+ def children(self):
+ return self._bad_iterator(self.val['elements'], self.val['len'])
+
+
+class BadChildrenContainerPrinter2(object):
+ """Children iterator returns a tuple of two elements with bad values."""
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ return 'container %s with %d elements' % (self.val['name'], self.val['len'])
+
+ @staticmethod
+ def _bad_iterator(pointer, len):
+ start = pointer
+ end = pointer + len
+ while pointer != end:
+ # The first argument is supposed to be a string.
+ yield (42, 'intentional violation of children iterator protocol')
+ pointer += 1
+
+ def children(self):
+ return self._bad_iterator(self.val['elements'], self.val['len'])
+
+
+def build_pretty_printer():
+ pp = gdb.printing.RegexpCollectionPrettyPrinter("bad-printers")
+
+ pp.add_printer('container1', '^container$',
+ BadChildrenContainerPrinter1)
+ pp.add_printer('container2', '^container$',
+ BadChildrenContainerPrinter2)
+
+ return pp
+
+
+my_pretty_printer = build_pretty_printer()
+gdb.printing.register_pretty_printer(gdb, my_pretty_printer)