From af1991d795a7aee72ecfe08b8811b2f9dc48b6de Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Mon, 6 Sep 2021 15:04:15 +0200 Subject: [PATCH] Remove string typing from ChoiceEnv Extracting parser environment information will be done through the GDB Value API --- gdb-port/parser-name-instrumentation-gdb.py | 1 + gdb-port/parser-type-instrumentation-gdb.py | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/gdb-port/parser-name-instrumentation-gdb.py b/gdb-port/parser-name-instrumentation-gdb.py index e13d113..ce4479c 100644 --- a/gdb-port/parser-name-instrumentation-gdb.py +++ b/gdb-port/parser-name-instrumentation-gdb.py @@ -2,6 +2,7 @@ # TODO: postordinate parser fails to get named # TODO: step-to-parser command # TODO: stop splicing gdb.parse_and_eval commands together in parser-type-instrumentation +# TODO: "current parser" on GUI is the one on top of the stack, while the argument of h_do_parse is not yet accounted for # quick way to get locals from frame.block() # {local.name : local for local in block} diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index c297877..d23371d 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -53,6 +53,7 @@ class VTTypes: # TODO: maybe save vtable type here on init, or potentially in Parser +# At this point in time, the parser Env classes are created in perform_lowlevel_parse. Ideally they could be initialized anywhere a HParser local named "parser" is accessible. class HParserEnv: def __init__(self, parser, top_level_parse): self.top_level_parse = top_level_parse @@ -217,16 +218,20 @@ class ChoiceEnv(HParserEnv): self.member_parsers = [] #frame = gdb.selected_frame() - h_sequence_p = gdb.parse_and_eval("(HSequence*) parser->env") - num_parsers = gdb.parse_and_eval("((HSequence *) parser->env)->len") - # TODO: should GDB do the array indexing operation, or should the Python code? - # TODO: top_level_parse.create_or_get_parser(address) - #[gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]") for index in range(0, num_parsers)] - # TODO: maybe the loop can be replaced with a list comprehension - #[top_level_parse.add_or_get_parser(gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) +"]")) for index in range(0, num_parsers)] + h_sequence_t = gdb.lookup_type("HSequence") + h_sequence_p_t = h_sequence_t.pointer() + + # Get the parser object + parser_obj = gdb.parse_and_eval("*parser") + # Get parser_obj.env, cast it to HSequence *, then dereference + p_env = parser_obj['env'].cast(h_sequence_p_t).dereference() + # Get length of HSequence + num_parsers = p_env['len'] + # Get the array of parsers in the sequence + p_array = p_env['p_array'] for index in range(0, num_parsers): - parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]") + parser_p = p_array[index] parser_obj = top_level_parse.add_or_get_parser(parser_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) -- GitLab