From 490c15837830e6341a1f83d4eb802e1fad8aa572 Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Mon, 6 Sep 2021 15:11:49 +0200 Subject: [PATCH] Remove string typing from PermutationEnv and SequenceEnv --- gdb-port/parser-type-instrumentation-gdb.py | 41 ++++++++++++--------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index d23371d..2bc1fad 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -444,17 +444,20 @@ class PermutationEnv(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)] - super().__init__(parser, top_level_parse) + 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) ) @@ -504,16 +507,20 @@ class SequenceEnv(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