Add pretty printing for GList and GSList
[platform/upstream/glib.git] / glib / glib.py
1 import gdb
2
3 # This is not quite right, as local vars may override symname
4 def read_global_var (symname):
5     return gdb.selected_frame().read_var(symname)
6
7 def g_quark_to_string (quark):
8     if quark == None:
9         return None
10     quark = long(quark)
11     if quark == 0:
12         return None
13     val = read_global_var ("g_quarks")
14     max_q = long(read_global_var ("g_quark_seq_id"))
15     if quark < max_q:
16         return val[quark].string()
17     return None
18
19 # We override the node printers too, so that node->next is not expanded
20 class GListNodePrinter:
21     "Prints a GList node"
22
23     def __init__ (self, val):
24         self.val = val
25
26     def to_string (self):
27         return "{data=%s, next=0x%x, prev=0x%x}" % (str(self.val["data"]), long(self.val["next"]), long(self.val["prev"]))
28
29 class GSListNodePrinter:
30     "Prints a GSList node"
31
32     def __init__ (self, val):
33         self.val = val
34
35     def to_string (self):
36         return "{data=%s, next=0x%x}" % (str(self.val["data"]), long(self.val["next"]))
37
38 class GListPrinter:
39     "Prints a GList"
40
41     class _iterator:
42         def __init__(self, head, listtype):
43             self.link = head
44             self.listtype = listtype
45             self.count = 0
46
47         def __iter__(self):
48             return self
49
50         def next(self):
51             if self.link == 0:
52                 raise StopIteration
53             data = self.link['data']
54             self.link = self.link['next']
55             count = self.count
56             self.count = self.count + 1
57             return ('[%d]' % count, data)
58
59     def __init__ (self, val, listtype):
60         self.val = val
61         self.listtype = listtype
62
63     def children(self):
64         return self._iterator(self.val, self.listtype)
65
66     def to_string (self):
67         return  "0x%x" % (long(self.val))
68
69     def display_hint (self):
70         return "array"
71
72 def pretty_printer_lookup (val):
73     if is_g_type_instance (val):
74         return GTypePrettyPrinter (val)
75
76 def pretty_printer_lookup (val):
77     # None yet, want things like hash table and list
78
79     type = val.type.unqualified()
80
81     # If it points to a reference, get the reference.
82     if type.code == gdb.TYPE_CODE_REF:
83         type = type.target ()
84
85     if type.code == gdb.TYPE_CODE_PTR:
86         type = type.target().unqualified()
87         t = str(type)
88         if t == "GList":
89             return GListPrinter(val, "GList")
90         if t == "GSList":
91             return GListPrinter(val, "GSList")
92     else:
93         t = str(type)
94         if t == "GList":
95             return GListNodePrinter(val)
96         if t == "GSList *":
97             return GListPrinter(val, "GSList")
98     return None
99
100 def register (obj):
101     if obj == None:
102         obj = gdb
103
104     obj.pretty_printers.append(pretty_printer_lookup)