diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index b6d7a30f11b4ea1e8bb9371db54060537762214a..faf5bec840ab5931569590bf5cbfc5deecb39f8c 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -10,6 +10,27 @@ parser_name_defaults = { #... } +class HParserEnv: + def __init__(self, parser, top_level_parse): + print("HParserEnv constructed") # DEBUG + + def name_from_vtable(self, parser): + parser_addr = parser.address + # TODO: do this without passing a string to gdb.parse_and_eval() + # perhaps using gdb.Value would be the best + vtable = gdb.parse_and_eval("((HParser*) " + parser_addr + ")->env->vtable") + try: + name = parser_name_defaults[vtable.name()] + except KeyError: + name = "(Unknown parser type)" + + return name + +# TODO: Unit test: +# make SequenceEnv(parser, top_level_parse) +# parser_array = [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)] +# compare pointers for equality + class SequenceEnv: def __init__(self, parser, top_level_parse): self.parser = parser @@ -27,6 +48,7 @@ class SequenceEnv: for index in range(0, num_parsers): parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]") parser_obj = top_level_parse.add_or_get_parser(parser_p) + #parser_obj.name_parser( self.name_from_vtable(parser_obj) ) self.member_parsers.append(parser_obj) # TODO