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):