From ce7baba2507ebdcfeab667fde0eb7f11fc35b6c2 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Fri, 13 Aug 2021 01:48:17 +0200
Subject: [PATCH] Fix random errors in parser type lookup

super().__init__() needed to be explicitly called for superclass instance variable to be initialized
---
 gdb-port/parser-type-instrumentation-gdb.py | 42 +++++++++++++++++++--
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index 074c052..122f076 100644
--- a/gdb-port/parser-type-instrumentation-gdb.py
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -57,8 +57,7 @@ class VTTypes:
 
 class HParserEnv:
 	def __init__(self, parser, top_level_parse):
-		print("HParserEnv constructed") # DEBUG
-		self.vt_types = top_level_parse.vt_types # Memoize parser type list
+		self.top_level_parse = top_level_parse
 
 	# parser is expected to be a Parser object
 	def name_from_vtable(self, parser):
@@ -67,10 +66,12 @@ class HParserEnv:
 		# perhaps using gdb.Value would be the best
 		vtable_p = gdb.parse_and_eval("((HParser*) " + str(parser_addr) + ")->vtable")
 		try:
-			name = parser_name_defaults[self.vt_types.lookup_by_address(vtable_p).name]
+			name = parser_name_defaults[self.top_level_parse.vt_types.lookup_by_address(vtable_p).name]
 		# if lookup_by_address() returns None
 		except AttributeError:
 			name = "(Unknown parser type (vtable symbol not found in lookup)"
+			print("Lookup fail for: " + str(hex(parser_addr))) # DEBUG
+			print("vt_types: " + str(self.top_level_parse.vt_types)) # DEBUG
 		except KeyError:
 			name = "(Unknown parser type (vtable exists but has no default name associated)"
 
@@ -105,6 +106,7 @@ class BindEnv(HParserEnv):
 		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))])
@@ -115,6 +117,10 @@ class BitsEnv(HParserEnv):
 
 		self.length =  gdb.parse_and_eval("((HBitsEnv *) parser->env)->length")
 		self.signedp =  gdb.parse_and_eval("((HBitsEnv *) parser->env)->signedp")
+		super().__init__(parser, top_level_parse)
+
+	def __str__(self):
+		return str([str(self.length), str(self.signedp)])
 
 class ButNotEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
@@ -124,6 +130,7 @@ class ButNotEnv(HParserEnv):
 		self.p1 = top_level_parse.add_or_get_parser(p1_p)
 		p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2")
 		self.p2 = top_level_parse.add_or_get_parser(p2_p)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.p1), str(self.p2)])
@@ -141,6 +148,7 @@ 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))])
@@ -152,6 +160,7 @@ 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)
 		self.member_parser = parser_obj
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser)])
@@ -162,6 +171,7 @@ class ChEnv(HParserEnv):
 
 		self.ch_arg = gdb.parse_and_eval("(uint8_t) parser->env")
 		self.ch_value = int(self.ch_arg)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(self.ch_value)
@@ -171,6 +181,7 @@ class CharsetEnv(HParserEnv):
 		self.parser = parser
 
 		self.charset_arg = gdb.parse_and_eval("(HCharset) parser->env")
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(self.charset_arg)
@@ -209,6 +220,7 @@ class DifferenceEnv(HParserEnv):
 		self.p1 = top_level_parse.add_or_get_parser(p1_p)
 		p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2")
 		self.p2 = top_level_parse.add_or_get_parser(p2_p)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.p1), str(self.p2)])
@@ -216,6 +228,7 @@ class DifferenceEnv(HParserEnv):
 class EndEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return "[]"
@@ -228,6 +241,7 @@ class EndiannessEnv(HParserEnv):
 		self.member_parser = top_level_parse.add_or_get_parser(member_parser_p)
 		endianness_val = gdb.parse_and_eval("((HParseEndianness *) parser->env)->endianness")
 		self.endianness = int(endianness_val)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(self.endianness)])
@@ -235,6 +249,7 @@ class EndiannessEnv(HParserEnv):
 class EpsilonEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return "[]"
@@ -247,6 +262,7 @@ class IgnoreEnv(HParserEnv):
 
 		ignore_obj = top_level_parse.add_or_get_parser(ignored_p)
 		self.member_parser = ignore_obj
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser)])
@@ -261,6 +277,7 @@ class IgnoreSeqEnv(HParserEnv):
 		seq_len = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->len")
 		which = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->which")
 		self.which = int(which)
+		super().__init__(parser, top_level_parse)
 
 		for index in range(0, seq_len):
 			parser_p = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->parsers[" + str(index) + "]")
@@ -282,6 +299,7 @@ class IndirectEnv(HParserEnv):
 		self.member_parser = top_level_parse.add_or_get_parser(member_parser_p)
 		touched = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->touched")
 		self.touched = bool(touched)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(self.touched)])
@@ -296,6 +314,7 @@ class IntRangeEnv(HParserEnv):
 		self.lower = int(lower_val)
 		upper_val = gdb.parse_and_eval("((HRange*) parser->env)->upper")
 		self.upper = int(upper_val)
+		super().__init__(parser, top_level_parse)
 
 
 	def __str__(self):
@@ -310,6 +329,7 @@ class LengthValueEnv(HParserEnv):
 
 		value_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->value")
 		self.value_parser = top_level_parse.add_or_get_parser(value_parser_p)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.length_parser), str(self.value_parser)])
@@ -323,6 +343,7 @@ class ManyEnv(HParserEnv):
 		# 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")
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count)
@@ -334,6 +355,7 @@ class NotEnv(HParserEnv):
 		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
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(self.member_parser)
@@ -341,6 +363,7 @@ class NotEnv(HParserEnv):
 class NothingEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return "[]"
@@ -352,6 +375,7 @@ class OptionalEnv(HParserEnv):
 		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
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(self.member_parser)
@@ -371,6 +395,7 @@ class PermutationEnv(HParserEnv):
 		#[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)]
+		super().__init__(parser, top_level_parse)
 
 		for index in range(0, num_parsers):
 			parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]")
@@ -391,6 +416,7 @@ class SeekEnv(HParserEnv):
 		whence_val = gdb.parse_and_eval("((HSeek *) parser->env)->whence")
 		self.whence = int(whence_val)
 		#TODO: enum for whence?
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.offset), str(self.whence)])
@@ -401,6 +427,7 @@ class SkipEnv(HParserEnv):
 
 		skip_val = gdb.parse_and_eval("((uintptr_t) parser->env)")
 		self.skip = int(skip_val)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(self.skip)
@@ -408,6 +435,7 @@ class SkipEnv(HParserEnv):
 class TellEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return "[]"
@@ -415,7 +443,7 @@ class TellEnv(HParserEnv):
 # TODO: numeric parameter passed to parse_and_eval
 class SequenceEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
-		super().__init__(parser, top_level_parse) # TODO: maybe move self.parser to base class. otherwise, is this needed?
+		super().__init__(parser, top_level_parse)
 		self.parser = parser
 		self.member_parsers = []
 
@@ -447,6 +475,7 @@ class TokenEnv(HParserEnv):
 		str_len = gdb.parse_and_eval("((HToken *) parser->env)->len")
 		self.str_len = int(str_len)
 		#TODO: get str_len bytes from memory and save it
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(hex(self.token))
@@ -454,6 +483,7 @@ class TokenEnv(HParserEnv):
 class UnimplemenetedEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return "[]"
@@ -467,6 +497,7 @@ class GetEnv(HParserEnv):
 		self.member_parser = top_level_parse.add_or_get_parser(member_parser_p)
 		key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key")
 		self.key = int(key_p)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(hex(self.key))])
@@ -479,6 +510,7 @@ class PutEnv(HParserEnv):
 		self.member_parser = top_level_parse.add_or_get_parser(member_parser_p)
 		key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key")
 		self.key = int(key_p)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(hex(self.key))])
@@ -489,6 +521,7 @@ class WhitespaceEnv(HParserEnv):
 
 		member_parser_p = gdb.parse_and_eval("(HParser *) parse->env")
 		self.member_parser = top_level_parse.add_or_get_parser(member_parser_p)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser)])
@@ -501,6 +534,7 @@ class XorEnv(HParserEnv):
 		self.p1 = top_level_parse.add_or_get_parser(p1_p)
 		p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2")
 		self.p2 = top_level_parse.add_or_get_parser(p2_p)
+		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.p1), str(self.p2)])
-- 
GitLab