From d30664b58016687379d42d18056827fe57830d20 Mon Sep 17 00:00:00 2001 From: Christoph Reimann Date: Tue, 13 Jul 2010 07:58:24 +0200 Subject: [PATCH] add support for new expr tags popcount, enumref, sumof --- xcbgen/expr.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/xcbgen/expr.py b/xcbgen/expr.py index b10b2eb..ddfb76c 100644 --- a/xcbgen/expr.py +++ b/xcbgen/expr.py @@ -40,6 +40,7 @@ class Expression(object): self.lenfield_name = None self.lenfield_type = None + self.lenfield_parent = None self.lenfield = None self.lenwire = False self.bitfield = False @@ -86,10 +87,37 @@ class Expression(object): # Constant expression self.nmemb = int(elt.text, 0) + elif elt.tag == 'popcount': + self.op = 'popcount' + self.rhs = Expression(list(elt)[0], parent) + self.lenfield_name = self.rhs.lenfield_name + # xcb_popcount returns 'int' - handle the type in the language-specific part + + elif elt.tag == 'enumref': + self.op = 'enumref' + self.lenfield_name = (elt.get('ref'), elt.text) + + elif elt.tag == 'sumof': + self.op = 'sumof' + self.lenfield_name = elt.get('ref') + else: # Notreached raise Exception("undefined tag '%s'" % elt.tag) - def fixed_size(self): return self.nmemb != None + + def resolve(self, module, parents): + if self.op == 'enumref': + self.lenfield_type = module.get_type(self.lenfield_name[0]) + self.lenfield_name = self.lenfield_name[1] + elif self.op == 'sumof': + # need to find the field with lenfield_name + for p in reversed(parents): + fields = dict([(f.field_name, f) for f in p.fields]) + if self.lenfield_name in fields.keys(): + self.lenfield_parent = p + self.lenfield_type = fields[self.lenfield_name].field_type + break + -- 2.34.1