From b362712d6923f4539d44711eca9aaa6b8bf37cca Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 18 Aug 2021 01:24:43 +0200
Subject: [PATCH] Name parsers automatically on first encounter

HParserEnv.name_from_vtable() should be automatically called now
---
 gdb-port/parser-type-instrumentation-gdb.py | 106 +++++++++++++++-----
 1 file changed, 83 insertions(+), 23 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index 7d672a7..befdd88 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):
-- 
GitLab