From 3620999240fe0ae65eaa944e196a3da4ab86ec9c Mon Sep 17 00:00:00 2001
From: Pompolic <pompolic@special-circumstanc.es>
Date: Tue, 7 Sep 2021 21:04:18 +0200
Subject: [PATCH] Bugfix: initialize HParserEnv before name lookup

name_from_vtable() needed the top_level_parse attribute
---
 gdb-port/parser-type-instrumentation-gdb.py | 22 ++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index 0ed97e5..ab07329 100644
--- a/gdb-port/parser-type-instrumentation-gdb.py
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -145,6 +145,7 @@ class BitsEnv(HParserEnv):
 class ButNotEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1")
 		p1_obj = top_level_parse.add_or_get_parser(p1_p)
@@ -156,7 +157,6 @@ class ButNotEnv(HParserEnv):
 		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):
 		return str([str(self.p1), str(self.p2)])
@@ -249,6 +249,7 @@ class ChoiceEnv(HParserEnv):
 class DifferenceEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		#TODO: maybe have a class for HTwoParsers-based envs
 		p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1")
@@ -261,7 +262,6 @@ class DifferenceEnv(HParserEnv):
 		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):
 		return str([str(self.p1), str(self.p2)])
@@ -277,6 +277,7 @@ class EndEnv(HParserEnv):
 class EndiannessEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		member_parser_p = gdb.parse_and_eval("((HParseEndianness *) parser->env)->p")
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
@@ -285,7 +286,6 @@ class EndiannessEnv(HParserEnv):
 		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)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(self.endianness)])
@@ -364,6 +364,7 @@ class IndirectEnv(HParserEnv):
 class IntRangeEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		member_parser_p = gdb.parse_and_eval("((HRange*) parser->env)->p")
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
@@ -374,7 +375,6 @@ 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):
@@ -383,6 +383,7 @@ class IntRangeEnv(HParserEnv):
 class LengthValueEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		length_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->length")
 		length_parser_obj = top_level_parse.add_or_get_parser(length_parser_p)
@@ -395,7 +396,6 @@ class LengthValueEnv(HParserEnv):
 		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):
 		return str([str(self.length_parser), str(self.value_parser)])
@@ -417,13 +417,13 @@ class ManyEnv(HParserEnv):
 class NotEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		member_p = gdb.parse_and_eval("(HParser*) parser->env")
 		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):
 		return str(self.member_parser)
@@ -439,13 +439,13 @@ class NothingEnv(HParserEnv):
 class OptionalEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		member_p = gdb.parse_and_eval("(HParser*) parser->env")
 		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):
 		return str(self.member_parser)
@@ -569,6 +569,7 @@ class UnimplemenetedEnv(HParserEnv):
 class GetEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p")
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
@@ -577,7 +578,6 @@ class GetEnv(HParserEnv):
 		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)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(hex(self.key))])
@@ -585,6 +585,7 @@ class GetEnv(HParserEnv):
 class PutEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p")
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
@@ -593,7 +594,6 @@ class PutEnv(HParserEnv):
 		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)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(hex(self.key))])
@@ -601,13 +601,13 @@ class PutEnv(HParserEnv):
 class WhitespaceEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		member_parser_p = gdb.parse_and_eval("(HParser *) parse->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)
 
 	def __str__(self):
 		return str([str(self.member_parser)])
@@ -615,6 +615,7 @@ class WhitespaceEnv(HParserEnv):
 class XorEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
 
 		p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1")
 		p1_obj = top_level_parse.add_or_get_parser(p1_p)
@@ -626,7 +627,6 @@ class XorEnv(HParserEnv):
 		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):
 		return str([str(self.p1), str(self.p2)])
-- 
GitLab