From 490c15837830e6341a1f83d4eb802e1fad8aa572 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Mon, 6 Sep 2021 15:11:49 +0200
Subject: [PATCH] Remove string typing from PermutationEnv and SequenceEnv

---
 gdb-port/parser-type-instrumentation-gdb.py | 41 ++++++++++++---------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index d23371d..2bc1fad 100644
--- a/gdb-port/parser-type-instrumentation-gdb.py
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -444,17 +444,20 @@ class PermutationEnv(HParserEnv):
 		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)]
-		super().__init__(parser, top_level_parse)
+		h_sequence_t = gdb.lookup_type("HSequence")
+		h_sequence_p_t = h_sequence_t.pointer()
+
+		# Get the parser object
+		parser_obj = gdb.parse_and_eval("*parser")
+		# Get parser_obj.env, cast it to HSequence *, then dereference
+		p_env = parser_obj['env'].cast(h_sequence_p_t).dereference()
+		# Get length of HSequence
+		num_parsers = p_env['len']
+		# Get the array of parsers in the sequence
+		p_array = p_env['p_array']
 
 		for index in range(0, num_parsers):
-			parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]")
+			parser_p = p_array[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) )
@@ -504,16 +507,20 @@ class SequenceEnv(HParserEnv):
 		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)]
+		h_sequence_t = gdb.lookup_type("HSequence")
+		h_sequence_p_t = h_sequence_t.pointer()
+
+		# Get the parser object
+		parser_obj = gdb.parse_and_eval("*parser")
+		# Get parser_obj.env, cast it to HSequence *, then dereference
+		p_env = parser_obj['env'].cast(h_sequence_p_t).dereference()
+		# Get length of HSequence
+		num_parsers = p_env['len']
+		# Get the array of parsers in the sequence
+		p_array = p_env['p_array']
 
 		for index in range(0, num_parsers):
-			parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]")
+			parser_p = p_array[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) )
-- 
GitLab