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