summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Reimann <oss@arcor.de>2010-07-13 07:58:24 +0200
committerChristoph Reimann <oss@arcor.de>2010-07-13 07:58:24 +0200
commitd30664b58016687379d42d18056827fe57830d20 (patch)
tree32d53e5a7d26dffb2cdc9b95b3a4524857dfd91a
parent29da739948419b660ff4a94706b1cb59c93ab9cc (diff)
add support for new expr tags popcount, enumref, sumof
-rw-r--r--xcbgen/expr.py30
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
+