binutils-gdb/gdb/testsuite/gdb.python/py-prettyprint.py
Joel Brobecker 61baf725ec update copyright year range in GDB files
This applies the second part of GDB's End of Year Procedure, which
updates the copyright year range in all of GDB's files.

gdb/ChangeLog:

        Update copyright year range in all GDB files.
2017-01-01 10:52:34 +04:00

315 lines
9.2 KiB
Python

# Copyright (C) 2008-2017 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 python pretty
# printers.
import re
import gdb
def _iterator (pointer, len):
start = pointer
end = pointer + len
while pointer != end:
yield ('[%d]' % int (pointer - start), pointer.dereference())
pointer += 1
# Same as _iterator but can be told to raise an exception.
def _iterator_except (pointer, len):
start = pointer
end = pointer + len
while pointer != end:
if exception_flag:
raise gdb.MemoryError ('hi bob')
yield ('[%d]' % int (pointer - start), pointer.dereference())
pointer += 1
# Test returning a Value from a printer.
class string_print (object):
def __init__(self, val):
self.val = val
def to_string(self):
return self.val['whybother']['contents']
# Test a class-based printer.
class ContainerPrinter (object):
def __init__(self, val):
self.val = val
def to_string(self):
return 'container %s with %d elements' % (self.val['name'], self.val['len'])
def children(self):
return _iterator(self.val['elements'], self.val['len'])
# Treats a container as array.
class ArrayPrinter (object):
def __init__(self, val):
self.val = val
def to_string(self):
return 'array %s with %d elements' % (self.val['name'], self.val['len'])
def children(self):
return _iterator(self.val['elements'], self.val['len'])
def display_hint (self):
return 'array'
# Flag to make NoStringContainerPrinter throw an exception.
exception_flag = False
# Test a printer where to_string is None
class NoStringContainerPrinter (object):
def __init__(self, val):
self.val = val
def to_string(self):
return None
def children(self):
return _iterator_except (self.val['elements'], self.val['len'])
class pp_s (object):
def __init__(self, val):
self.val = val
def to_string(self):
a = self.val["a"]
b = self.val["b"]
if a.address != b:
raise Exception("&a(%s) != b(%s)" % (str(a.address), str(b)))
return " a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">"
class pp_ss (object):
def __init__(self, val):
self.val = val
def to_string(self):
return "a=<" + str(self.val["a"]) + "> b=<" + str(self.val["b"]) + ">"
class pp_sss (object):
def __init__(self, val):
self.val = val
def to_string(self):
return "a=<" + str(self.val['a']) + "> b=<" + str(self.val["b"]) + ">"
class pp_multiple_virtual (object):
def __init__ (self, val):
self.val = val
def to_string (self):
return "pp value variable is: " + str (self.val['value'])
class pp_vbase1 (object):
def __init__ (self, val):
self.val = val
def to_string (self):
return "pp class name: " + self.val.type.tag
class pp_nullstr (object):
def __init__(self, val):
self.val = val
def to_string(self):
return self.val['s'].string(gdb.target_charset())
class pp_ns (object):
"Print a std::basic_string of some kind"
def __init__(self, val):
self.val = val
def to_string(self):
len = self.val['length']
return self.val['null_str'].string (gdb.target_charset(), length = len)
def display_hint (self):
return 'string'
pp_ls_encoding = None
class pp_ls (object):
"Print a std::basic_string of some kind"
def __init__(self, val):
self.val = val
def to_string(self):
length = self.val['len']
if pp_ls_encoding is not None:
if length >= 0:
return self.val['lazy_str'].lazy_string(
encoding = pp_ls_encoding,
length = length)
else:
return self.val['lazy_str'].lazy_string(
encoding = pp_ls_encoding)
else:
if length >= 0:
return self.val['lazy_str'].lazy_string(length = length)
else:
return self.val['lazy_str'].lazy_string()
def display_hint (self):
return 'string'
class pp_hint_error (object):
"Throw error from display_hint"
def __init__(self, val):
self.val = val
def to_string(self):
return 'hint_error_val'
def display_hint (self):
raise Exception("hint failed")
class pp_children_as_list (object):
"Throw error from display_hint"
def __init__(self, val):
self.val = val
def to_string(self):
return 'children_as_list_val'
def children (self):
return [('one', 1)]
class pp_outer (object):
"Print struct outer"
def __init__ (self, val):
self.val = val
def to_string (self):
return "x = %s" % self.val['x']
def children (self):
yield 's', self.val['s']
yield 'x', self.val['x']
class MemoryErrorString (object):
"Raise an error"
def __init__(self, val):
self.val = val
def to_string(self):
raise gdb.MemoryError ("Cannot access memory.")
def display_hint (self):
return 'string'
class pp_eval_type (object):
def __init__(self, val):
self.val = val
def to_string(self):
gdb.execute("bt", to_string=True)
return "eval=<" + str(gdb.parse_and_eval("eval_func (123456789, 2, 3, 4, 5, 6, 7, 8)")) + ">"
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
def disable_lookup_function ():
lookup_function.enabled = False
def enable_lookup_function ():
lookup_function.enabled = True
def register_pretty_printers ():
pretty_printers_dict[re.compile ('^struct s$')] = pp_s
pretty_printers_dict[re.compile ('^s$')] = pp_s
pretty_printers_dict[re.compile ('^S$')] = pp_s
pretty_printers_dict[re.compile ('^struct ss$')] = pp_ss
pretty_printers_dict[re.compile ('^ss$')] = pp_ss
pretty_printers_dict[re.compile ('^const S &$')] = pp_s
pretty_printers_dict[re.compile ('^SSS$')] = pp_sss
pretty_printers_dict[re.compile ('^VirtualTest$')] = pp_multiple_virtual
pretty_printers_dict[re.compile ('^Vbase1$')] = pp_vbase1
pretty_printers_dict[re.compile ('^struct nullstr$')] = pp_nullstr
pretty_printers_dict[re.compile ('^nullstr$')] = pp_nullstr
# Note that we purposely omit the typedef names here.
# Printer lookup is based on canonical name.
# However, we do need both tagged and untagged variants, to handle
# both the C and C++ cases.
pretty_printers_dict[re.compile ('^struct string_repr$')] = string_print
pretty_printers_dict[re.compile ('^struct container$')] = ContainerPrinter
pretty_printers_dict[re.compile ('^struct justchildren$')] = NoStringContainerPrinter
pretty_printers_dict[re.compile ('^string_repr$')] = string_print
pretty_printers_dict[re.compile ('^container$')] = ContainerPrinter
pretty_printers_dict[re.compile ('^justchildren$')] = NoStringContainerPrinter
pretty_printers_dict[re.compile ('^struct ns$')] = pp_ns
pretty_printers_dict[re.compile ('^ns$')] = pp_ns
pretty_printers_dict[re.compile ('^struct lazystring$')] = pp_ls
pretty_printers_dict[re.compile ('^lazystring$')] = pp_ls
pretty_printers_dict[re.compile ('^struct outerstruct$')] = pp_outer
pretty_printers_dict[re.compile ('^outerstruct$')] = pp_outer
pretty_printers_dict[re.compile ('^struct hint_error$')] = pp_hint_error
pretty_printers_dict[re.compile ('^hint_error$')] = pp_hint_error
pretty_printers_dict[re.compile ('^struct children_as_list$')] = pp_children_as_list
pretty_printers_dict[re.compile ('^children_as_list$')] = pp_children_as_list
pretty_printers_dict[re.compile ('^memory_error$')] = MemoryErrorString
pretty_printers_dict[re.compile ('^eval_type_s$')] = pp_eval_type
pretty_printers_dict = {}
register_pretty_printers ()
gdb.pretty_printers.append (lookup_function)