diff options
Diffstat (limited to 'gdb/testsuite/gdb.python/py-nested-maps.py')
-rw-r--r-- | gdb/testsuite/gdb.python/py-nested-maps.py | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.python/py-nested-maps.py b/gdb/testsuite/gdb.python/py-nested-maps.py new file mode 100644 index 0000000..d3fdf59 --- /dev/null +++ b/gdb/testsuite/gdb.python/py-nested-maps.py @@ -0,0 +1,135 @@ +# Copyright (C) 2019 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 printing of +# nested map like structures. + +import re +import gdb + +def _iterator1 (pointer, len): + while len > 0: + map = pointer.dereference() + yield ('', map['name']) + yield ('', map.dereference()) + pointer += 1 + len -= 1 + +def _iterator2 (pointer1, pointer2, len): + while len > 0: + yield ("", pointer1.dereference()) + yield ("", pointer2.dereference()) + pointer1 += 1 + pointer2 += 1 + len -= 1 + +class pp_map (object): + def __init__(self, val): + self.val = val + + def to_string(self): + if (self.val['show_header'] == 0): + return None + else: + return "pp_map" + + def children(self): + return _iterator2(self.val['keys'], + self.val['values'], + self.val['length']) + + def display_hint (self): + return 'map' + +class pp_map_map (object): + def __init__(self, val): + self.val = val + + def to_string(self): + if (self.val['show_header'] == 0): + return None + else: + return "pp_map_map" + + def children(self): + return _iterator1(self.val['values'], + self.val['length']) + + def display_hint (self): + return 'map' + +def lookup_function (val): + "Look-up and return a pretty-printer that can print val." + + # Get the type. + type = val.type + + # If it points to a reference, get the reference. + if type.code == gdb.TYPE_CODE_REF: + type = type.target () + + # Get the unqualified type, stripped of typedefs. + type = type.unqualified ().strip_typedefs () + + # Get the type name. + typename = type.tag + + if typename == None: + return None + + # Iterate over local dictionary of types to determine + # if a printer is registered for that type. Return an + # instantiation of the printer if found. + for function in pretty_printers_dict: + if function.match (typename): + return pretty_printers_dict[function] (val) + + # Cannot find a pretty printer. Return None. + return None + +# Lookup a printer for VAL in the typedefs dict. +def lookup_typedefs_function (val): + "Look-up and return a pretty-printer that can print val (typedefs)." + + # Get the type. + type = val.type + + if type == None or type.name == None or type.code != gdb.TYPE_CODE_TYPEDEF: + return None + + # Iterate over local dictionary of typedef types to determine if a + # printer is registered for that type. Return an instantiation of + # the printer if found. + for function in typedefs_pretty_printers_dict: + if function.match (type.name): + return typedefs_pretty_printers_dict[function] (val) + + # Cannot find a pretty printer. + return None + +def register_pretty_printers (): + pretty_printers_dict[re.compile ('^struct map_t$')] = pp_map + pretty_printers_dict[re.compile ('^map_t$')] = pp_map + pretty_printers_dict[re.compile ('^struct map_map_t$')] = pp_map_map + pretty_printers_dict[re.compile ('^map_map_t$')] = pp_map_map + +# Dict for struct types with typedefs fully stripped. +pretty_printers_dict = {} +# Dict for typedef types. +typedefs_pretty_printers_dict = {} + +register_pretty_printers () +gdb.pretty_printers.append (lookup_function) +gdb.pretty_printers.append (lookup_typedefs_function) |