From 2f24b0df0d444a470637bb0dfe64c9e89f2d2f23 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Mon, 6 Sep 2021 18:42:29 +0200
Subject: [PATCH] Remove string typing from HParserEnv and IgnoreSeqEnv

---
 gdb-port/parser-type-instrumentation-gdb.py | 22 +++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index 2bc1fad..0ed97e5 100644
--- a/gdb-port/parser-type-instrumentation-gdb.py
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -70,8 +70,14 @@ class HParserEnv:
 
 		# or:
 		# p_env = gdb.parse_and_eval("parser").dereference()['env']
+		hparser_t = gdb.lookup_type("HParser")
+		hparser_p_t = hparser_t.pointer()
 
-		vtable_p = gdb.parse_and_eval("((HParser*) " + str(parser_addr) + ")->vtable")
+		# Construct a gdb.Value around the address we were given, and cast it to a HParser*
+		parser_addr_val = gdb.Value(parser_addr)
+		parser_p = parser_addr_val.cast(hparser_p_t)
+
+		vtable_p = parser_p.dereference()['vtable']
 		try:
 			name = parser_name_defaults[self.top_level_parse.vt_types.lookup_by_address(vtable_p).name]
 		# if lookup_by_address() returns None
@@ -313,14 +319,22 @@ class IgnoreSeqEnv(HParserEnv):
 		self.parser = parser
 		self.member_parsers = []
 
+		h_ignoreseq_t = gdb.lookup_type("HIgnoreSeq")
+		h_ignoreseq_p_t = h_ignoreseq_t.pointer()
+
+		parser_obj = gdb.parse_and_eval("*parser")
+		p_env = parser_obj['env'].cast(h_ignoreseq_p_t).dereference()
 		ignoreseq_p = gdb.parse_and_eval("(HIgnoreSeq*) parser->env")
-		seq_len = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->len")
-		which = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->which")
+		#seq_len = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->len")
+		seq_len = p_env['len']
+		#which = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->which")
+		which = p_env['which']
 		self.which = int(which)
+		parsers = p_env['parsers']
 		super().__init__(parser, top_level_parse)
 
 		for index in range(0, seq_len):
-			parser_p = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->parsers[" + str(index) + "]")
+			parser_p = parsers[index]
 			parser_obj = top_level_parse.add_or_get_parser(parser_p)
 			# TODO: name parsers on add?
 			# TODO: move updates to parsers to TopLevelParse?
-- 
GitLab