From 70463e3cf7a7620c4c52ac383edc200be0478d0a Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 30 Jun 2021 06:23:32 +0200
Subject: [PATCH] WIP commit

---
 gdb-port/parser-type-instrumentation-gdb.py | 81 ++++++++++++++++++++-
 1 file changed, 79 insertions(+), 2 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index 4cececd..c3fa7e3 100644
--- a/gdb-port/parser-type-instrumentation-gdb.py
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -78,9 +78,25 @@ class HParserEnv:
 # parser_array = [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)]
 # compare pointers for equality
 
+# TODO: consistent naming for member_parser, member_parser_pointers, 
+
+class AttrBoolEnv(HParserEnv):
+	def __init__(self, parser, top_level_parse):
+		self.parser = parser
+	
+		member_parser_p =  gdb.parse_and_eval("((HAttrBool *) parser->env)->p")
+		self.member_parser = top_level_parse.add_or_get_parser(member_parser_p)
+		self.predicate_p =  gdb.parse_and_eval("((HAttrBool *) parser->env)->pred")
+		self.user_data_p =  gdb.parse_and_eval("((HAttrBool *) parser->env)->user_data")
+	
+	def __str__(self):
+		return str(self.member_parser)
+	
+class BitsEnv(HParserEnv):
+
 class SequenceEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
-		super().__init__(parser, top_level_parse)
+		super().__init__(parser, top_level_parse) # TODO: maybe move self.parser to base class. otherwise, is this needed?
 		self.parser = parser
 		self.member_parsers = []
 
@@ -158,6 +174,31 @@ class ChEnv(HParserEnv):
 
 	def __str__(self):
 		return str(self.ch_value)
+	
+class ChoiceEnv(HParserEnv):
+	def __init__(self, parser, top_level_parse):
+		super().__init__(parser, top_level_parse)
+		self.parser = parser
+		self.member_parsers = []
+
+		#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?
+		# TODO: top_level_parse.create_or_get_parser(address)
+		#[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)]
+
+		for index in range(0, num_parsers):
+			parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]")
+			parser_obj = top_level_parse.add_or_get_parser(parser_p)
+			if parser_obj.name is None:
+				parser_obj.name_parser( self.name_from_vtable(parser_obj) )
+			self.member_parsers.append(parser_obj)
+	
+	def __str__(self):
+		return str([str(parser) for parser in self.member_parsers])
 
 class ManyEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
@@ -172,14 +213,50 @@ class ManyEnv(HParserEnv):
 	def __str__(self):
 		return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count)
 
+
+class NotEnv(HParserEnv):
+	def __init__(self, parser, top_level_parse):
+		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
+
+	def __str__(self):
+		return str(self.member_parser)
+
+class NothingEnv(HParserEnv):
+	def __init__(self, parser, top_level_parse):
+		self.parser = parser
+		
+	def __str__(self):
+		return "[]"
+
+class OptionalEnv(HParserEnv):
+	def __init__(self, parser, top_level_parse):
+		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
+
+	def __str__(self):
+		return str(self.member_parser)
+
+
 vtable_to_env = {
 	'sequence_vt': SequenceEnv,
 	'ignore_vt': IgnoreEnv,
 	'action_vt': ActionEnv,
 	'and_vt': AndEnv,
+	'attr_bool_vt': AttrBoolEnv,
 	'ch_vt': ChEnv,
-	'many_vt': ManyEnv
+	'many_vt': ManyEnv,
+	'not_vt': NotEnv,
+	'nothing_vt': NothingEnv,
+	'optional_vt': OptionalEnv
 	}
+	
 
 # 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:
-- 
GitLab