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())