diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index 43a31df664460daa6a010c8b3908f3daf779d958..4417cae410de9c3062eb27d8d608611f408603ce 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 86a95b5f63b7e8984419b5eab54140483ab0e0bc..4b96082d0a867436c84b42a07cd5af4e3060f475 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):