master
1# pretty printing for the language.
2# put "source /path/to/zig_gdb_pretty_printers.py" in ~/.gdbinit to load it automatically.
3import gdb.printing
4
5
6class ZigPrettyPrinter(gdb.printing.PrettyPrinter):
7 def __init__(self):
8 super().__init__('Zig')
9
10 def __call__(self, val):
11 tag = val.type.tag
12 if tag is None:
13 return None
14 if tag == '[]u8':
15 return StringPrinter(val)
16 if tag.startswith('[]'):
17 return SlicePrinter(val)
18 if tag.startswith('?'):
19 return OptionalPrinter(val)
20 return None
21
22
23class SlicePrinter:
24 def __init__(self, val):
25 self.val = val
26
27 def to_string(self):
28 return f"{self.val['len']} items at {self.val['ptr']}"
29
30 def children(self):
31 def it(val):
32 for i in range(int(val['len'])):
33 item = val['ptr'] + i
34 yield (f'[{i}]', item.dereference())
35 return it(self.val)
36
37 def display_hint(self):
38 return 'array'
39
40
41class StringPrinter:
42 def __init__(self, val):
43 self.val = val
44
45 def to_string(self):
46 return self.val['ptr'].string(length=int(self.val['len']))
47
48 def display_hint(self):
49 return 'string'
50
51
52class OptionalPrinter:
53 def __init__(self, val):
54 self.val = val
55
56 def to_string(self):
57 if self.val['some']:
58 return self.val['data']
59 else:
60 return 'null'
61
62
63gdb.printing.register_pretty_printer(gdb.current_objfile(), ZigPrettyPrinter())