diff options
author | Christoph Reimann <oss@arcor.de> | 2010-07-13 07:58:24 +0200 |
---|---|---|
committer | Christoph Reimann <oss@arcor.de> | 2010-07-13 07:58:24 +0200 |
commit | d30664b58016687379d42d18056827fe57830d20 (patch) | |
tree | 32d53e5a7d26dffb2cdc9b95b3a4524857dfd91a /xcbgen | |
parent | 29da739948419b660ff4a94706b1cb59c93ab9cc (diff) | |
download | xcb-proto-d30664b58016687379d42d18056827fe57830d20.tar.gz |
add support for new expr tags popcount, enumref, sumof
Diffstat (limited to 'xcbgen')
-rw-r--r-- | xcbgen/expr.py | 30 |
1 files changed, 29 insertions, 1 deletions
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 + |