From 7769cb74f206e265e795edbf69f93ec798631d5a Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Mon, 13 Sep 2021 14:24:04 +0200
Subject: [PATCH] (WIP) Finish removing gdb.parse_and_eval() statements

---
 gdb-port/parser-type-instrumentation-gdb.py | 135 +++++++++++++++-----
 1 file changed, 102 insertions(+), 33 deletions(-)

diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py
index 5555e87..2908dfe 100644
--- a/gdb-port/parser-type-instrumentation-gdb.py
+++ b/gdb-port/parser-type-instrumentation-gdb.py
@@ -399,15 +399,21 @@ class IgnoreSeqEnv(HParserEnv):
 class IndirectEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		hindirectenv_t = gdb.lookup_type("HIndirectEnv")
+		hindirectenv_p_t = hindirectenv_t.pointer()
+		parser_env = parser_val['env'].cast(hindirectenv_p_t).dereference()
 
-		member_parser_p = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->parser")
+		#member_parser_p = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->parser")
+		member_parser_p = parser_env['parser']
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
 		if parser_obj.name is None:
 			parser_obj.name_parser( self.name_from_vtable(parser_obj) )
 		self.member_parser = parser_obj
-		touched = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->touched")
+		#touched = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->touched")
+		touched = parser_env['touched']
 		self.touched = bool(touched)
-		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.member_parser), str(self.touched)])
@@ -416,15 +422,22 @@ class IntRangeEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		hrange_t = gdb.lookup_type("HRange")
+		hrange_p_t = hrange_t.pointer()
+		parser_env = parser_val['env'].cast(hrange_p_t).dereference()
 
-		member_parser_p = gdb.parse_and_eval("((HRange*) parser->env)->p")
+		#member_parser_p = gdb.parse_and_eval("((HRange*) parser->env)->p")
+		member_parser_p = parser_env['p']
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
 		if parser_obj.name is None:
 			parser_obj.name_parser( self.name_from_vtable(parser_obj) )
 		self.member_parser = parser_obj
-		lower_val = gdb.parse_and_eval("((HRange*) parser->env)->lower")
+		#lower_val = gdb.parse_and_eval("((HRange*) parser->env)->lower")
+		lower_val = parser_env['lower']
 		self.lower = int(lower_val)
-		upper_val = gdb.parse_and_eval("((HRange*) parser->env)->upper")
+		#upper_val = gdb.parse_and_eval("((HRange*) parser->env)->upper")
+		upper_val = parser_env['upper']
 		self.upper = int(upper_val)
 
 
@@ -435,14 +448,20 @@ class LengthValueEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		hlenval_t = gdb.lookup_type("HLenVal")
+		hlenval_p_t = hlenval_t.pointer()
+		parser_env = parser_val['env'].cast(hlenval_p_t).dereference()
 
-		length_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->length")
+		#length_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->length")
+		length_parser_p = parser_env['length']
 		length_parser_obj = top_level_parse.add_or_get_parser(length_parser_p)
 		if length_parser_obj.name is None:
 			length_parser_obj.name_parser( self.name_from_vtable(length_parser_obj) )
 		self.length_parser = length_parser_obj
 
-		value_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->value")
+		#value_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->value")
+		value_parser_p = parser_env['value']
 		value_parser_obj = top_level_parse.add_or_get_parser(value_parser_p)
 		if value_parser_obj.name is None:
 			value_parser_obj.name_parser( self.name_from_vtable(value_parser_obj) )
@@ -454,13 +473,26 @@ class LengthValueEnv(HParserEnv):
 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")
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		hrepeat_t = gdb.lookup_type("HRepeat")
+		hrepeat_p_t = hrepeat_t.pointer()
+		parser_env = parser_val['env'].cast(hrepeat_p_t).dereference()
+
+		#self.count = gdb.parse_and_eval("((HRepeat *) parser->env)->count")
+		self.count = parser_env['count']
+		#self.separator = gdb.parse_and_eval("((HRepeat *) parser->env)->sep")
+		separator_p = parser_env['separator']
+		separator_p_obj = top_level_parse.add_or_get_parser(separator_p)
+		if separator_p_obj.name is None:
+			separator_p_obj.name_parser( self.name_from_vtable(separator_p_obj) )
+		self.separator = separator_p_obj
+		#self.p = gdb.parse_and_eval("((HRepeat *) parser->env)->p")
+		p_ptr = parser_env['p']
+		p_obj = top_level_parse.add_or_get_parser(p_ptr)
+		if p_obj.name is None:
+			p_obj.name_parser( self.name_from_vtable(p_ptr) )
+		self.p = p_obj
 
 	def __str__(self):
 		return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count)
@@ -469,8 +501,10 @@ class NotEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
 
-		member_p = gdb.parse_and_eval("(HParser*) parser->env")
+		#member_p = gdb.parse_and_eval("(HParser*) parser->env")
+		member_p = parser_val['env'].cast(self_hparser_p_t)
 		parser_obj = top_level_parse.add_or_get_parser(member_p)
 		if parser_obj.name is None:
 			parser_obj.name_parser( self.name_from_vtable(parser_obj) )
@@ -491,8 +525,10 @@ class OptionalEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
 
-		member_p = gdb.parse_and_eval("(HParser*) parser->env")
+		#member_p = gdb.parse_and_eval("(HParser*) parser->env")
+		member_p = parser_val['env'].cast(self_hparser_p_t)
 		parser_obj = top_level_parse.add_or_get_parser(member_p)
 		if parser_obj.name is None:
 			parser_obj.name_parser( self.name_from_vtable(parser_obj) )
@@ -533,13 +569,18 @@ class PermutationEnv(HParserEnv):
 class SeekEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		hseek_t = gdb.lookup_type("HSeek")
+		hseek_p_t = hseek_t.pointer()
+		parser_env = parser_val['env'].cast(hseek_p_t).dereference()
 
-		offset_val = gdb.parse_and_eval("((HSeek *) parser->env)->offset")
+		#offset_val = gdb.parse_and_eval("((HSeek *) parser->env)->offset")
+		offset_val = parser_env['offset']
 		self.offset = int(offset_val)
-		whence_val = gdb.parse_and_eval("((HSeek *) parser->env)->whence")
+		#whence_val = gdb.parse_and_eval("((HSeek *) parser->env)->whence")
+		whence_val = parser_env['whence']
 		self.whence = int(whence_val)
-		#TODO: enum for whence?
-		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str([str(self.offset), str(self.whence)])
@@ -547,10 +588,13 @@ class SeekEnv(HParserEnv):
 class SkipEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		uintptr_t = gdb.lookup_type("uintptr_t")
 
-		skip_val = gdb.parse_and_eval("((uintptr_t) parser->env)")
+		#skip_val = gdb.parse_and_eval("((uintptr_t) parser->env)")
+		skip_val = parser_val['env'].cast(uintptr_t)
 		self.skip = int(skip_val)
-		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(self.skip)
@@ -563,7 +607,6 @@ class TellEnv(HParserEnv):
 	def __str__(self):
 		return "[]"
 
-# TODO: numeric parameter passed to parse_and_eval
 class SequenceEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		super().__init__(parser, top_level_parse)
@@ -596,13 +639,19 @@ class SequenceEnv(HParserEnv):
 class TokenEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
+		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		htoken_t = gdb.lookup_type("HToken")
+		htoken_p_t = htoken_t.pointer()
+		parser_env = parser_val['env'].cast(htoken_p_t).dereference()
 
-		str_p = gdb.parse_and_eval("((HToken *) parser->env)->str")
+		#str_p = gdb.parse_and_eval("((HToken *) parser->env)->str")
+		str_p = parser_env['str']
 		self.token = str_p
-		str_len = gdb.parse_and_eval("((HToken *) parser->env)->len")
+		#str_len = gdb.parse_and_eval("((HToken *) parser->env)->len")
+		str_len = parser_env['len']
 		self.str_len = int(str_len)
 		#TODO: get str_len bytes from memory and save it
-		super().__init__(parser, top_level_parse)
 
 	def __str__(self):
 		return str(hex(self.token))
@@ -620,13 +669,19 @@ class GetEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		hstoredvalue_t = gdb.lookup_type("HStoredValue")
+		hstoredvalue_p_t = hstoredvalue_t.pointer()
+		parser_env = parser_val['env'].cast(hstoredvalue_p_t).dereference()
 
-		member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p")
+		#member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p")
+		member_parser_p = parser_env['p']
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
 		if parser_obj.name is None:
 			parser_obj.name_parser( self.name_from_vtable(parser_obj) )
 		self.member_parser = parser_obj
-		key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key")
+		#key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key")
+		key_p = parser_env['key']
 		self.key = int(key_p)
 
 	def __str__(self):
@@ -636,13 +691,19 @@ class PutEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		hstoredvalue_t = gdb.lookup_type("HStoredValue")
+		hstoredvalue_p_t = hstoredvalue_t.pointer()
+		parser_env = parser_val['env'].cast(hstoredvalue_p_t).dereference()
 
-		member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p")
+		#member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p")
+		member_parser_p = parser_env['p']
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
 		if parser_obj.name is None:
 			parser_obj.name_parser( self.name_from_vtable(parser_obj) )
 		self.member_parser = parser_obj
-		key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key")
+		#key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key")
+		key_p = parser_env['key']
 		self.key = int(key_p)
 
 	def __str__(self):
@@ -652,8 +713,10 @@ class WhitespaceEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
 
-		member_parser_p = gdb.parse_and_eval("(HParser *) parse->env")
+		#member_parser_p = gdb.parse_and_eval("(HParser *) parse->env")
+		member_p = parser_val['env'].cast(self_hparser_p_t)
 		parser_obj = top_level_parse.add_or_get_parser(member_parser_p)
 		if parser_obj.name is None:
 			parser_obj.name_parser( self.name_from_vtable(parser_obj) )
@@ -666,13 +729,19 @@ class XorEnv(HParserEnv):
 	def __init__(self, parser, top_level_parse):
 		self.parser = parser
 		super().__init__(parser, top_level_parse)
+		parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference()
+		htwoparsers_t = gdb.lookup_type("HTwoParsers")
+		htwoparsers_p_t = htwoparsers_t.pointer()
+		parser_env = parser_val['env'].cast(htwoparsers_p_t).dereference()
 
-		p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1")
+		#p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1")
+		p1_p = parser_env['p1']
 		p1_obj = top_level_parse.add_or_get_parser(p1_p)
 		if p1_obj.name is None:
 			p1_obj.name_parser( self.name_from_vtable(p1_obj) )
 		self.p1 = p1_obj
-		p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2")
+		#p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2")
+		p2_p = parser_env['p2']
 		p2_obj = top_level_parse.add_or_get_parser(p2_p)
 		if p2_obj.name is None:
 			p2_obj.name_parser( self.name_from_vtable(p2_obj) )
-- 
GitLab