From 738756ae110a60d8f185cd6d832dc7a52055ecb6 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Mon, 10 Oct 2022 18:21:16 +0200
Subject: [PATCH] Add token addresses to display for debugging

---
 gdb-port/ast.py             | 14 ++++++++++++++
 gdb-port/top-level-parse.py |  9 ++++++---
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index f6cee66..6950b3f 100644
--- a/gdb-port/ast.py
+++ b/gdb-port/ast.py
@@ -46,6 +46,9 @@ class HParseResult:
 	def __str__(self):
 		return "HParseResult ({0}) {{ arena:{1}, data:{2} }}".format(hex(self.address), self.arena, self.ast)
 
+	def str_no_deref(self): # DEBUG?
+		return "HParseResult ({0}) {{ arena:{1}, data:{2} }}".format(hex(self.address), self.arena, self.ast.str_no_deref())
+
 class HParsedToken:
 	token_union_members = {
 		2: 'bytes',
@@ -158,6 +161,13 @@ class HParsedToken:
 		else:
 			return "{{ {0}, {1} }}".format(self.token_type, self.data)
 
+	def str_no_deref(self): # DEBUG?
+		if self.children:
+			return "{{ {0}, {1} }}".format(self.token_type, self.data.str_no_deref())
+		else:
+			return "{{ {0}, {1} }}".format(self.token_type, self.data)
+
+
 class HCountedArray:
 	HCountedArray_t_p = None
 
@@ -185,6 +195,10 @@ class HCountedArray:
 		elements_str = ", ".join([str(elem) for elem in self.elements_as_list()])
 		return "[ {0} ]".format(elements_str)
 
+	def str_no_deref(self): # DEBUG?
+		elements_str = ", ".join([hex(elem.address) for elem in self.elements_as_list()])
+		return "[ {0} ]".format(elements_str)
+
 # Unlike HCountedArray and HParsedToken, HBytes wraps the gdb.Value that is the structure itself, not a pointer to it
 # This is because the bytes field of a HParsedToken is a HBytes, not a HBytes*
 # If a HBytes* is really needed: for a given HParsedToken hpt,
diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py
index 868d259..d3ca70b 100644
--- a/gdb-port/top-level-parse.py
+++ b/gdb-port/top-level-parse.py
@@ -233,7 +233,7 @@ class TopLevelParse:
 		del self.input_index_tree_path[self.current_parse_depth+1:]
 		token_addr = hparseresult_addr.cast(gdb.lookup_type("HParseResult").pointer())['ast']
 		if token_addr:
-			self.input_token_map[int(token_addr)] = {'start': self.starting_input_index[self.current_parse_depth], 'end': index}
+			self.input_token_map[int(token_addr)] = {'start': self.starting_input_index[self.current_parse_depth], 'end': index, 'hparseresult': hex(hparseresult_addr)}
 		#print("DEBUG: current parse depth:", self.current_parse_depth)
 		#print("DEBUG: finished tokens:", self.input_stream_indices)
 		#print("DEBUG: path:", self.input_index_tree_path)
@@ -393,7 +393,8 @@ class TopLevelParse:
 		print("print_input_chunk(): start: ", start, "end: ", end)
 		#h = min(rows, len(token.children))
 		tokenmap_values = list(self.input_token_map.values())
-		tokenmap_val_list = [token for token in list(self.input_token_map.values()) if (token['start'] <= start and token['start'] <= end)]
+		#tokenmap_val_list = [token for token in list(self.input_token_map.values()) if (token['start'] <= start and token['start'] <= end)]
+		tokenmap_val_list = [dict(token, addr=hex(key)) for key, token in self.input_token_map.items() if (token['start'] <= start and token['start'] <= end)]
 		numrows = min(rows, len(tokenmap_val_list))
 		#row_lengths_for_columns = [len([token for token in list(tokenmap_values) if (token['start'] <= x and x >= token['end'])]) for x in range(start,end+1)]
 		#numrows = min(rows, max(row_lengths_for_columns))
@@ -430,8 +431,10 @@ class TopLevelParse:
 					#	print("end: ", end, "start+w", start+w)
 					#	print("w:", w, "h=rows:", h)
 					#	raise ie
+		charbufrows_token_debug = [ "".join(row) + "\n" + str(tokenmap_values_sorted[index]) for index, row in enumerate(charbuf)]
 		charbufrows = ["".join(row) for row in charbuf]
-		charbuf_final = "\n".join(charbufrows)
+		#charbuf_final = "\n".join(charbufrows)
+		charbuf_final = "\n".join(charbufrows_token_debug)
 		print(charbuf_final)
 
 	def print_input_map(self, token, rec_depth=0, parent_bounds=None):
-- 
GitLab