diff options
author | Doug Evans <dje@google.com> | 2015-04-28 21:53:54 -0700 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2015-04-28 21:53:54 -0700 |
commit | 69b4374a87e5029ac4831c7a4471815514df662f (patch) | |
tree | 9041be61ebe1e1bd8df326650dd946102f15ae77 /gdb/testsuite/gdb.python/py-bad-printers.py | |
parent | 5e7cf0784c9b543b1870b974a78244c40105c523 (diff) | |
download | gdb-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.py | 80 |
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) |