From 91c9956de663905e7ce882f2223e7f2d58f5d68e Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Tue, 21 Jun 2022 23:05:40 +0200
Subject: [PATCH] Reduce code repetition, HParsedToken.children is now a list

---
 gdb-port/ast.py | 27 ++++++++++-----------------
 1 file changed, 10 insertions(+), 17 deletions(-)

diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index 0935f94..463c0b3 100644
--- a/gdb-port/ast.py
+++ b/gdb-port/ast.py
@@ -86,7 +86,7 @@ class HParsedToken:
 		# TODO: doesn't work for "custom" sequence types such as Dict
 		if self.token_type == __class__.TT_SEQUENCE:
 			#TODO: decide if this should be a HCountedArray or array of HParsedTokens
-			self.children = self.populate_children()
+			self.children = self.populate_children_list()
 
 	def read_token_val(self):
 		if not __class__.HParsedToken_t_p:
@@ -94,18 +94,15 @@ class HParsedToken:
 		tok = gdb.Value(self.address).cast(__class__.HParsedToken_t_p)
 		return tok
 
-	def has_token_data(self, token_type):
+	def has_token_data(self):
 		if not __class__.no_token_data:
 			__class__.no_token_data = [v.enumval for v in gdb.lookup_type("enum HTokenType_").fields() if v.name in ["TT_INVALID", "TT_RESERVED_1", "TT_ERR", "TT_NONE", "TT_MAX"]]
 		no_token_data = __class__.no_token_data or [v.enumval for v in gdb.lookup_type("enum HTokenType_").fields() if v.name in ["TT_INVALID", "TT_RESERVED_1", "TT_ERR", "TT_NONE", "TT_MAX"]]
-		return token_type not in no_token_data
+		return self.token_type not in no_token_data
 
 	#TODO: return make HCountedArray from data, if this is a sequence
 	def read_token_data(self):
-		if not __class__.HParsedToken_t_p:
-			__class__.HParsedToken_t_p = gdb.lookup_type("HParsedToken").pointer()
-		tok = gdb.Value(self.address).cast(__class__.HParsedToken_t_p)
-		if self.has_token_data(self.token_type):
+		if self.has_token_data():
 			# We default to using the 'user' field. Also covers custom token types
 			member = 'user'
 			# Check if self.token_type < TT_MAX
@@ -130,20 +127,16 @@ class HParsedToken:
 	#   (HBytes, HCountedArray), or as a literal such as int.
 	#   currently it can return gdb.Values
 	def obj_from_token_data(self, member):
-		if not __class__.HParsedToken_t_p:
-			__class__.HParsedToken_t_p = gdb.lookup_type("HParsedToken").pointer()
-		tok = gdb.Value(self.address).cast(__class__.HParsedToken_t_p)
-
 		if member == "bytes":
-			return HBytes(tok[member])
+			return HBytes(self.token[member])
 		if member == "seq":
-			return HCountedArray(int(tok[member]))
+			return HCountedArray(int(self.token[member]))
 		else:
-			return tok[member]
+			return self.token[member]
 
-	def populate_children(self):
-		data_as_array = HCountedArray(int(self.token['seq']))
-		return data_as_array
+	def populate_children_list(self):
+		data_as_list = self.obj_from_token_data("seq").elements_as_list()
+		return data_as_list
 
 	# TODO: this is probably fine for already-parsed input, but needs more thought
 	def __str__(self):
-- 
GitLab