From a58a8276876c3a8e6940e74cedf3c105706e4e4a Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 8 Jun 2022 19:21:12 +0200
Subject: [PATCH] (WIP) Also remember the parser that generated the AST
 framgent

---
 gdb-port/ast.py                | 7 ++++++-
 gdb-port/hammer-breakpoints.py | 9 +++++----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index 43a31df..4417cae 100644
--- a/gdb-port/ast.py
+++ b/gdb-port/ast.py
@@ -152,12 +152,17 @@ class HCountedArray:
 class ASTManager:
 	def __init__(self):
 		self.top_node = None
+		# The HParser that returned this AST fragment
+		self.parser = None
 
-	def set_top_node(self, address):
+	def set_top_node(self, address, parser):
 		# Address has to be an integer or gdb.Value or this will break
 		self.top_node = HParseResult(address)
+		# Expected to be a Parser object (probably best to use TopLevelParse for the lookup)
+		self.parser = parser
 
 	def print_ast(self):
+		print(self.parser)
 		print(self.top_node)
 
 ast_manager = ASTManager()
diff --git a/gdb-port/hammer-breakpoints.py b/gdb-port/hammer-breakpoints.py
index 86a95b5..4b96082 100644
--- a/gdb-port/hammer-breakpoints.py
+++ b/gdb-port/hammer-breakpoints.py
@@ -87,10 +87,11 @@ class HDoParseRetBreakpoint(gdb.Breakpoint):
 
 		# Checking want_result_of() here avoids instantiating a HParseResult every time h_do_parse returns
 		stop = top_level_parse.want_result_of(parser)
-		if stop and ret_val != 0:
-				ast_manager.set_top_node(ret_val)
-				ast_manager.print_ast()
-				return True
+		if stop:
+			parser_obj = top_level_parse.parser_by_address(parser)
+			ast_manager.set_top_node(ret_val, parser_obj)
+			ast_manager.print_ast()
+			return True
 		return False
 
 class PerformLowLevelParseBreakpoint(gdb.Breakpoint):
-- 
GitLab