diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index 7d672a71c8f22ea006e5f2cdaebef8a82afccf76..befdd88e7a9a4158d05ac03b0886e9eea413ce1c 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -89,9 +89,13 @@ class HParserEnv: class AttrBoolEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) member_parser_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->p") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj self.predicate_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->pred") self.user_data_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->user_data") @@ -101,14 +105,17 @@ class AttrBoolEnv(HParserEnv): class BindEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) member_parser_p = gdb.parse_and_eval("((HBindEnv *) parser->env)->p") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj continuation_p = gdb.parse_and_eval("((HBindEnv *) parser->env)->k") self.continuation = int(continuation_p) env_p = gdb.parse_and_eval("((HBindEnv *) parser->env)->env") self.env = int(env_p) - super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(hex(self.continuation)), str(hex(self.env))]) @@ -129,9 +136,15 @@ class ButNotEnv(HParserEnv): self.parser = parser p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1") - self.p1 = top_level_parse.add_or_get_parser(p1_p) + p1_obj = top_level_parse.add_or_get_parser(p1_p) + if p1_obj.name is None: + p1_obj.name_parser( self.name_from_vtable(p1_obj) ) + self.p1 = p1_obj p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") - self.p2 = top_level_parse.add_or_get_parser(p2_p) + p2_obj = top_level_parse.add_or_get_parser(p2_p) + if p2_obj.name is None: + p2_obj.name_parser( self.name_from_vtable(p2_obj) ) + self.p2 = p2_obj super().__init__(parser, top_level_parse) def __str__(self): @@ -140,9 +153,12 @@ class ButNotEnv(HParserEnv): class ActionEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) member_parser_p = gdb.parse_and_eval("((HParseAction*) parser->env)->p") parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) self.member_parser = parser_obj # should return a HAction @@ -150,7 +166,6 @@ class ActionEnv(HParserEnv): self.action = int(action) user_data_p = gdb.parse_and_eval("((HParseAction*) parser->env)->user_data") self.user_data_p = int(user_data_p) - super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(hex(self.action)), str(hex(self.user_data_p))]) @@ -161,6 +176,8 @@ class AndEnv(HParserEnv): member_parser_p = gdb.parse_and_eval("(HParser*) parser->env") parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) self.member_parser = parser_obj super().__init__(parser, top_level_parse) @@ -218,10 +235,17 @@ class DifferenceEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + #TODO: maybe have a class for HTwoParsers-based envs p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1") - self.p1 = top_level_parse.add_or_get_parser(p1_p) + p1_obj = top_level_parse.add_or_get_parser(p1_p) + if p1_obj.name is None: + p1_obj.name_parser( self.name_from_vtable(p1_obj) ) + self.p1 = p1_obj p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") - self.p2 = top_level_parse.add_or_get_parser(p2_p) + p2_obj = top_level_parse.add_or_get_parser(p2_p) + if p2_obj.name is None: + p2_obj.name_parser( self.name_from_vtable(p2_obj) ) + self.p2 = p2_obj super().__init__(parser, top_level_parse) def __str__(self): @@ -240,7 +264,10 @@ class EndiannessEnv(HParserEnv): self.parser = parser member_parser_p = gdb.parse_and_eval("((HParseEndianness *) parser->env)->p") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj endianness_val = gdb.parse_and_eval("((HParseEndianness *) parser->env)->endianness") self.endianness = int(endianness_val) super().__init__(parser, top_level_parse) @@ -259,12 +286,14 @@ class EpsilonEnv(HParserEnv): class IgnoreEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) ignored_p = gdb.parse_and_eval("(HParser*) parser->env") ignore_obj = top_level_parse.add_or_get_parser(ignored_p) + if ignore_obj.name is None: + ignore_obj.name_parser( self.name_from_vtable(ignore_obj) ) self.member_parser = ignore_obj - super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser)]) @@ -298,7 +327,10 @@ class IndirectEnv(HParserEnv): self.parser = parser member_parser_p = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->parser") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj touched = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->touched") self.touched = bool(touched) super().__init__(parser, top_level_parse) @@ -311,7 +343,10 @@ class IntRangeEnv(HParserEnv): self.parser = parser member_parser_p = gdb.parse_and_eval("((HRange*) parser->env)->p") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj lower_val = gdb.parse_and_eval("((HRange*) parser->env)->lower") self.lower = int(lower_val) upper_val = gdb.parse_and_eval("((HRange*) parser->env)->upper") @@ -327,10 +362,16 @@ class LengthValueEnv(HParserEnv): self.parser = parser length_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->length") - self.length_parser = top_level_parse.add_or_get_parser(length_parser_p) + length_parser_obj = top_level_parse.add_or_get_parser(length_parser_p) + if length_parser_obj.name is None: + length_parser_obj.name_parser( self.name_from_vtable(length_parser_obj) ) + self.length_parser = length_parser_obj value_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->value") - self.value_parser = top_level_parse.add_or_get_parser(value_parser_p) + value_parser_obj = top_level_parse.add_or_get_parser(value_parser_p) + if value_parser_obj.name is None: + value_parser_obj.name_parser( self.name_from_vtable(value_parser_obj) ) + self.value_parser = value_parser_obj super().__init__(parser, top_level_parse) def __str__(self): @@ -355,8 +396,10 @@ class NotEnv(HParserEnv): 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 + parser_obj = top_level_parse.add_or_get_parser(member_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj super().__init__(parser, top_level_parse) def __str__(self): @@ -375,8 +418,10 @@ class OptionalEnv(HParserEnv): 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 + parser_obj = top_level_parse.add_or_get_parser(member_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj super().__init__(parser, top_level_parse) def __str__(self): @@ -496,7 +541,10 @@ class GetEnv(HParserEnv): self.parser = parser member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") self.key = int(key_p) super().__init__(parser, top_level_parse) @@ -509,7 +557,10 @@ class PutEnv(HParserEnv): self.parser = parser member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") self.key = int(key_p) super().__init__(parser, top_level_parse) @@ -522,7 +573,10 @@ class WhitespaceEnv(HParserEnv): self.parser = parser member_parser_p = gdb.parse_and_eval("(HParser *) parse->env") - self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + parser_obj = top_level_parse.add_or_get_parser(member_parser_p) + if parser_obj.name is None: + parser_obj.name_parser( self.name_from_vtable(parser_obj) ) + self.member_parser = parser_obj super().__init__(parser, top_level_parse) def __str__(self): @@ -533,9 +587,15 @@ class XorEnv(HParserEnv): self.parser = parser p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1") - self.p1 = top_level_parse.add_or_get_parser(p1_p) + p1_obj = top_level_parse.add_or_get_parser(p1_p) + if p1_obj.name is None: + p1_obj.name_parser( self.name_from_vtable(p1_obj) ) + self.p1 = p1_obj p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") - self.p2 = top_level_parse.add_or_get_parser(p2_p) + p2_obj = top_level_parse.add_or_get_parser(p2_p) + if p2_obj.name is None: + p2_obj.name_parser( self.name_from_vtable(p2_obj) ) + self.p2 = p2_obj super().__init__(parser, top_level_parse) def __str__(self):