From 70463e3cf7a7620c4c52ac383edc200be0478d0a Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Wed, 30 Jun 2021 06:23:32 +0200 Subject: [PATCH] WIP commit --- gdb-port/parser-type-instrumentation-gdb.py | 81 ++++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index 4cececd..c3fa7e3 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -78,9 +78,25 @@ class HParserEnv: # 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 +# TODO: consistent naming for member_parser, member_parser_pointers, + +class AttrBoolEnv(HParserEnv): + def __init__(self, parser, top_level_parse): + self.parser = parser + + member_parser_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->p") + self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + self.predicate_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->pred") + self.user_data_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->user_data") + + def __str__(self): + return str(self.member_parser) + +class BitsEnv(HParserEnv): + class SequenceEnv(HParserEnv): def __init__(self, parser, top_level_parse): - super().__init__(parser, top_level_parse) + super().__init__(parser, top_level_parse) # TODO: maybe move self.parser to base class. otherwise, is this needed? self.parser = parser self.member_parsers = [] @@ -158,6 +174,31 @@ class ChEnv(HParserEnv): def __str__(self): return str(self.ch_value) + +class ChoiceEnv(HParserEnv): + def __init__(self, parser, top_level_parse): + super().__init__(parser, top_level_parse) + self.parser = parser + 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)] + + 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) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parsers.append(parser_obj) + + def __str__(self): + return str([str(parser) for parser in self.member_parsers]) class ManyEnv(HParserEnv): def __init__(self, parser, top_level_parse): @@ -172,14 +213,50 @@ class ManyEnv(HParserEnv): def __str__(self): return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count) + +class NotEnv(HParserEnv): + def __init__(self, parser, top_level_parse): + self.parser = parser + + member_p = gdb.parse_and_eval("(HParser*) parser->env") + member_obj = top_level_parse.add_or_get_parser(member_p) + self.member_parser = member_obj + + def __str__(self): + return str(self.member_parser) + +class NothingEnv(HParserEnv): + def __init__(self, parser, top_level_parse): + self.parser = parser + + def __str__(self): + return "[]" + +class OptionalEnv(HParserEnv): + def __init__(self, parser, top_level_parse): + self.parser = parser + + member_p = gdb.parse_and_eval("(HParser*) parser->env") + member_obj = top_level_parse.add_or_get_parser(member_p) + self.member_parser = member_obj + + def __str__(self): + return str(self.member_parser) + + vtable_to_env = { 'sequence_vt': SequenceEnv, 'ignore_vt': IgnoreEnv, 'action_vt': ActionEnv, 'and_vt': AndEnv, + 'attr_bool_vt': AttrBoolEnv, 'ch_vt': ChEnv, - 'many_vt': ManyEnv + 'many_vt': ManyEnv, + 'not_vt': NotEnv, + 'nothing_vt': NothingEnv, + 'optional_vt': OptionalEnv } + # When given a Parser object, decompose_parser() deduces its type from the vtable, and returns the appropriate HParserEnv subclass, containing member parsers and args # Not sure what to name it. Alternatives: -- GitLab