From ddec58fafba10d16f3abc3167565e5aaeeeac788 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Tue, 29 Jun 2021 01:08:38 +0200
Subject: [PATCH] WIP commit

---
 gdb-port/parser-type-instrumentation-gdb.py | 54 +++++++++++++++++++--
 1 file changed, 51 insertions(+), 3 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index ba1a01c..4cececd 100644
--- a/gdb-port/parser-type-instrumentation-gdb.py
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -84,7 +84,7 @@ class SequenceEnv(HParserEnv):
 		self.parser = parser
 		self.member_parsers = []
 
-		frame = gdb.selected_frame()
+		#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?
@@ -149,9 +149,57 @@ class AndEnv:
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
 		self.member_parser = parser_obj
 
-vtables = {
+class ChEnv(HParserEnv):
+	def __init__(self, parser, top_level_parse):
+		self.parser = parser
+
+		self.ch_arg = gdb.parse_and_eval("(uint8_t) parser->env")
+		self.ch_value = ord(self.ch_arg.value())
+
+	def __str__(self):
+		return str(self.ch_value)
+
+class ManyEnv(HParserEnv):
+	def __init__(self, parser, top_level_parse):
+		self.parser = parser
+
+		h_repeat_p = gdb.parse_and_eval("(HSequence*) parser->env")
+		self.count = gdb.parse_and_eval("((HRepeat *) parser->env)->count")
+		# 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")
+
+	def __str__(self):
+		return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count)
+
+vtable_to_env = {
 	'sequence_vt': SequenceEnv,
 	'ignore_vt': IgnoreEnv,
 	'action_vt': ActionEnv,
-	'and_vt': AndEnv
+	'and_vt': AndEnv,
+	'ch_vt': ChEnv,
+	'many_vt': ManyEnv
 	}
+
+# 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:
+# ParserDisassembler?
+# ParserExploder?
+# ParserDecomposer?
+
+class ParserDecombinator:
+	def __init__(self):
+		# TODO: make a better data structure than vtable_to_env + parser_name_defaults + this
+		self.vt_envs = { k : (v,vtable_to_env[k]) for k,v in parser_name_defaults.items() }
+
+	def decompose_parser(self, parser, top_level_parse):
+		# Sadly, this is stringly typed for now
+		parser_addr = parser.address
+		vtable_p = gdb.parse_and_eval("((HParser*) " + str(parser_addr) + ")->vtable")
+		try:
+			envClass = vtable_to_env[vtable_p.name]
+		except KeyError:
+			print("Unknown vtable: " + str(vtable_p))
+			return None
+
+		return envClass(parser, top_level_parse)
-- 
GitLab