Commit 79bf4003da

xackus <14938807+xackus@users.noreply.github.com>
2020-05-06 22:08:04
stage1: add ZigList gdb pretty printing
1 parent ba43492
Changed files (1)
tools/zig-gdb.py
@@ -0,0 +1,39 @@
+# pretty printing for stage1
+# put "source /path/to/zig-gdb.py" in ~/.gdbinit to load it automatically
+
+import gdb.printing
+
+class ZigListPrinter:
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+        return '%s of length %d, capacity %d' % (self.val.type.name, int(self.val['length']), int(self.val['capacity']))
+
+    def children(self):
+        def it(ziglist):
+            for i in range(int(ziglist.val['length'])):
+                item = ziglist.val['items'] + i
+                yield ('[%d]' % i, item.dereference())
+        return it(self)
+
+    def display_hint(self):
+        return 'array'
+
+# handle both Buf and ZigList<char> because Buf* doesn't work otherwise (gdb bug?)
+class BufPrinter:
+    def __init__(self, val):
+        self.val = val['list'] if val.type.name == 'Buf' else val
+
+    def to_string(self):
+        return self.val['items'].string(length=int(self.val['length']))
+
+    def display_hint(self):
+        return 'string'
+
+pp = gdb.printing.RegexpCollectionPrettyPrinter('zig')
+pp.add_printer('Buf', '^Buf$', BufPrinter)
+pp.add_printer('ZigList<char>', '^ZigList<char>$', BufPrinter)
+pp.add_printer('ZigList', '^ZigList<.*>$', ZigListPrinter)
+
+gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)