summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorArne Döring <arne.doering@gmx.net>2019-01-21 17:38:17 +0100
committerArne Döring <arne.doering@gmx.net>2019-01-21 17:38:17 +0100
commitb4d329d69f9172114212a2225ff68dbd789ebf68 (patch)
treee2870416796b9155a65a861cf7cb36754e787f28
parentea0c1811c52355335b4a884a1c963bfe332aebc4 (diff)
downloadNim-b4d329d69f9172114212a2225ff68dbd789ebf68.tar.gz
precise printer injection
-rw-r--r--tools/nim-gdb.py19
1 files changed, 14 insertions, 5 deletions
diff --git a/tools/nim-gdb.py b/tools/nim-gdb.py
index fb7eff565..2abaf6926 100644
--- a/tools/nim-gdb.py
+++ b/tools/nim-gdb.py
@@ -522,11 +522,20 @@ def makematcher(klass):
       printErrorOnce(typeName, "No matcher for type '" + typeName + "': " + str(e) + "\n")
   return matcher
 
+def register_nim_pretty_printers_for_object(objfile):
+  nimMainSym = gdb.lookup_global_symbol("NimMain", gdb.SYMBOL_FUNCTIONS_DOMAIN)
+  if nimMainSym and nimMainSym.symtab.objfile == objfile:
+    print("set Nim pretty printers for ", objfile.filename)
+
+    objfile.type_printers = [NimTypePrinter()]
+    objfile.pretty_printers = [makematcher(var) for var in list(globals().values()) if hasattr(var, 'pattern')]
+
+# Register pretty printers for all objfiles that are already loaded.
+for old_objfile in gdb.objfiles():
+  register_nim_pretty_printers_for_object(old_objfile)
+
+# Register an event handler to register nim pretty printers for all future objfiles.
 def new_object_handler(event):
-  nimobjfile = gdb.current_objfile() or gdb.objfiles()[0]
-  nimobjfile.type_printers = []
-  nimobjfile.type_printers = [NimTypePrinter()]
-  nimobjfile.pretty_printers = []
-  nimobjfile.pretty_printers.extend([makematcher(var) for var in list(globals().values()) if hasattr(var, 'pattern')])
+  register_nim_pretty_printers_for_object(event.new_objfile)
 
 gdb.events.new_objfile.connect(new_object_handler)