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