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