aboutsummaryrefslogtreecommitdiff
path: root/tools/zig_gdb_pretty_printers.py
blob: 1bc4b36e5749714f252eb6aa8bd8ccd44b95fbbb (plain)
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
# pretty printing for the language.
# put "source /path/to/zig_gdb_pretty_printers.py" in ~/.gdbinit to load it automatically.
import gdb.printing


class ZigPrettyPrinter(gdb.printing.PrettyPrinter):
    def __init__(self):
        super().__init__('Zig')

    def __call__(self, val):
        tag = val.type.tag
        if tag is None:
            return None
        if tag == '[]u8':
            return StringPrinter(val)
        if tag.startswith('[]'):
            return SlicePrinter(val)
        if tag.startswith('?'):
            return OptionalPrinter(val)
        return None


class SlicePrinter:
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return f"{self.val['len']} items at {self.val['ptr']}"

    def children(self):
        def it(val):
            for i in range(int(val['len'])):
                item = val['ptr'] + i
                yield (f'[{i}]', item.dereference())
        return it(self.val)

    def display_hint(self):
        return 'array'


class StringPrinter:
    def __init__(self, val):
        self.val = val

    def to_string(self):
        return self.val['ptr'].string(length=int(self.val['len']))

    def display_hint(self):
        return 'string'


class OptionalPrinter:
    def __init__(self, val):
        self.val = val

    def to_string(self):
        if self.val['some']:
            return self.val['data']
        else:
            return 'null'


gdb.printing.register_pretty_printer(gdb.current_objfile(), ZigPrettyPrinter())