-
-
Notifications
You must be signed in to change notification settings - Fork 102
/
helper.py
80 lines (60 loc) · 2.02 KB
/
helper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# -*- coding: utf-8 -*-
# Helper module for pretty-printers
# SPDX-FileCopyrightText: 2013 Kevin Funk <kfunk@kde.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later
import sys
# BEGIN: Utilities for wrapping differences of Python 2.x and Python 3
# Inspired by http://pythonhosted.org/six/
# Useful for very coarse version differentiation.
PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3
# create Python 2.x & 3.x compatible iterator base
if PY3:
Iterator = object
else:
class Iterator(object):
def next(self):
return type(self).__next__(self)
if PY3:
unichr = chr
else:
unichr = unichr
# END
# BEGIN: Helper functions for pretty-printers
def has_field(val, name):
"""Check whether @p val (gdb.Value) has a field named @p name"""
try:
val[name]
return True
except Exception:
return False
def default_iterator(val):
for field in val.type.fields():
yield field.name, val[field.name]
class FunctionLookup:
def __init__(self, gdb, pretty_printers_dict):
self.gdb = gdb
self.pretty_printers_dict = pretty_printers_dict
def __call__(self, 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 == self.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 self.pretty_printers_dict:
if function.search (typename):
return self.pretty_printers_dict[function](val)
# Cannot find a pretty printer. Return None.
return None
# END