From d518fffc9a4aacb6a89b8749002d6dbe98820a45 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 18 May 2022 21:29:49 +0200
Subject: [PATCH] Generic .read_member() function for HParsedToken

---
 gdb-port/ast.py | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index 59810a1..e8a8d65 100644
--- a/gdb-port/ast.py
+++ b/gdb-port/ast.py
@@ -85,16 +85,23 @@ class HParsedToken:
 		self.address = address
 		self.parent = parent
 		self.children = children
-		self.token_type = token_type or self.read_token_type()
+		#self.token_type = token_type or self.read_token_type()
+		self.token_type = token_type or self.read_member('token_type')
 
-		#TODO
+		# The entire HParsedToken as a gdb.Value
 		self.token = self.read_token_val()
+		# The data, either a union in the struct or a HTokenData
+		# The encapsulated value is returned in either case
 		self.data = self.read_token_data()
+		self.index = self.read_member('index')
+		self.bit_length = self.read_member('bit_length')
+		self.bit_offset = self.read_member('bit_offset')
 
 	def read_token_val(self):
 		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
 		return tok
 
+	# TODO: remove
 	def read_token_type(self):
 		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
 		return tok['token_type']
@@ -104,6 +111,7 @@ class HParsedToken:
 
 
 	def read_token_data(self):
+		#TODO: check for presence of token_data member and handle that branch
 		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
 		if self.has_token_data(self.token_type):
 			# We default to using the 'user' field. Also covers custom token types
@@ -115,3 +123,7 @@ class HParsedToken:
 		# Token type is one of the enum values known not to have data
 		else:
 			return None
+
+	def read_member(self, member_name):
+		tok = gdb.Value(self.address).cast(HParsedToken_t_p)
+		return tok[member_name]
-- 
GitLab