From ddec58fafba10d16f3abc3167565e5aaeeeac788 Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Tue, 29 Jun 2021 01:08:38 +0200 Subject: [PATCH] WIP commit --- gdb-port/parser-type-instrumentation-gdb.py | 54 +++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index ba1a01c..4cececd 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -84,7 +84,7 @@ class SequenceEnv(HParserEnv): self.parser = parser self.member_parsers = [] - frame = gdb.selected_frame() + #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? @@ -149,9 +149,57 @@ class AndEnv: parser_obj = top_level_parse.add_or_get_parser(member_parser_p) self.member_parser = parser_obj -vtables = { +class ChEnv(HParserEnv): + def __init__(self, parser, top_level_parse): + self.parser = parser + + self.ch_arg = gdb.parse_and_eval("(uint8_t) parser->env") + self.ch_value = ord(self.ch_arg.value()) + + def __str__(self): + return str(self.ch_value) + +class ManyEnv(HParserEnv): + def __init__(self, parser, top_level_parse): + self.parser = parser + + h_repeat_p = gdb.parse_and_eval("(HSequence*) parser->env") + self.count = gdb.parse_and_eval("((HRepeat *) parser->env)->count") + # TODO: resolve these pointers, make parser objects + self.separator = gdb.parse_and_eval("((HRepeat *) parser->env)->sep") + self.p = gdb.parse_and_eval("((HRepeat *) parser->env)->p") + + def __str__(self): + return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count) + +vtable_to_env = { 'sequence_vt': SequenceEnv, 'ignore_vt': IgnoreEnv, 'action_vt': ActionEnv, - 'and_vt': AndEnv + 'and_vt': AndEnv, + 'ch_vt': ChEnv, + 'many_vt': ManyEnv } + +# 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: +# ParserDisassembler? +# ParserExploder? +# ParserDecomposer? + +class ParserDecombinator: + def __init__(self): + # TODO: make a better data structure than vtable_to_env + parser_name_defaults + this + self.vt_envs = { k : (v,vtable_to_env[k]) for k,v in parser_name_defaults.items() } + + def decompose_parser(self, parser, top_level_parse): + # Sadly, this is stringly typed for now + parser_addr = parser.address + vtable_p = gdb.parse_and_eval("((HParser*) " + str(parser_addr) + ")->vtable") + try: + envClass = vtable_to_env[vtable_p.name] + except KeyError: + print("Unknown vtable: " + str(vtable_p)) + return None + + return envClass(parser, top_level_parse) -- GitLab