From 863eda00190184b907ddfb0c156a50307b2c179d Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Sat, 19 Jun 2021 00:40:09 +0200
Subject: [PATCH] WIP commit

Backend support for parser hierarchy widget
---
 gdb-port/gui.py                             |  2 +-
 gdb-port/parser-name-instrumentation-gdb.py |  4 +++
 gdb-port/parser-type-instrumentation-gdb.py | 37 +++++++++++++++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 gdb-port/parser-type-instrumentation-gdb.py

diff --git a/gdb-port/gui.py b/gdb-port/gui.py
index e680e9c..5130ca8 100644
--- a/gdb-port/gui.py
+++ b/gdb-port/gui.py
@@ -32,7 +32,7 @@ else:
 	root.columnconfigure(0, weight=1)
 	root.rowconfigure(0, weight=1)
 
-	parser = StringVar()
+	parser = StringVar() # TODO: encapsulate variables to avoid namespace pollution
 	parser_addr = StringVar()
 	input_chunk = StringVar()
 	presentation_layer = PresentationLayer(top_level_parse.peek_parser(), parser, parser_addr, input_chunk)
diff --git a/gdb-port/parser-name-instrumentation-gdb.py b/gdb-port/parser-name-instrumentation-gdb.py
index 999a6da..2b6c047 100644
--- a/gdb-port/parser-name-instrumentation-gdb.py
+++ b/gdb-port/parser-name-instrumentation-gdb.py
@@ -1,6 +1,9 @@
 # TODO: handlers for filters
 # TODO: postordinate parser fails to get named
 
+# quick way to get locals from frame.block()
+# {local.name : local for local in block}
+
 class Parser:
 	#TODO: remove
 	_parser_names = {}
@@ -141,6 +144,7 @@ class TopLevelParse:
 
 	# Memoize the parser object for this particular address, then push it on the stack
 	# Returns the parser object we just initalized (or the one already existing)
+	#TODO: memoize_parser method
 	def enter_perform_lowlevel_parse(self, parser_addr):
 		try:
 			parser_obj = self.parser_objs[parser_addr]
diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
new file mode 100644
index 0000000..3a46a3c
--- /dev/null
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -0,0 +1,37 @@
+# These need to be constructed in HDoParseBreakpoint (or at least in a scope where 'parser' is visible)
+# TODO: these can learn of parsers before the parser name instrumentation does
+# TopLevelParse should be amenable to adding parsers to the dict through here
+
+
+class SequenceEnv:
+	def __init__(self, parser, top_level_parse)
+		self.parser = parser
+		self.member_parsers = []
+
+		frame = gdb.selected_frame()
+		h_sequence_p = gdb.parse_and_eval("(HSequence*) parser->env")
+		# TODO
+
+
+class IgnoreEnv:
+	def __init__(self, parser, top_level_parse):
+		self.parser = parser
+		self.member_parser_pointers = []
+
+		ignored_p = gdb.parse_and_eval("(HParser*) parser->env")
+
+		# Ideally we could look up ignored_p using top_level_parse, but it will not find a result if perform_lowlevel_parse(ignored_p) wasn't called yet
+		#TODO: method to add parser in TopLevelParse
+
+		'''
+		try:
+			parser_obj = top_level_parse.parser_objs[ignored_p]
+		except KeyError:
+			# Create a parser object with no name and the address of the parser
+			parser_obj = Parser(None, int(ignored_p))
+			top_level_parse.parser_objs[int(ignored_p)] = parser_obj
+
+		self.member_parsers.append(parser_obj)
+		'''
+		self.member_parsers.append(ignored_p)
+
-- 
GitLab