| # Copyright (C) 2008-2021 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) |