aboutsummaryrefslogtreecommitdiff
path: root/libxcb/xcb-proto/xcbgen/expr.py
diff options
context:
space:
mode:
Diffstat (limited to 'libxcb/xcb-proto/xcbgen/expr.py')
-rw-r--r--libxcb/xcb-proto/xcbgen/expr.py31
1 files changed, 25 insertions, 6 deletions
diff --git a/libxcb/xcb-proto/xcbgen/expr.py b/libxcb/xcb-proto/xcbgen/expr.py
index e4fb06e93..e4ee8c6e2 100644
--- a/libxcb/xcb-proto/xcbgen/expr.py
+++ b/libxcb/xcb-proto/xcbgen/expr.py
@@ -22,6 +22,7 @@ class Field(object):
self.wire = wire
self.auto = auto
self.isfd = isfd
+ self.parent = None
class Expression(object):
@@ -52,6 +53,8 @@ class Expression(object):
self.lhs = None
self.rhs = None
+ self.contains_listelement_ref = False
+
if elt.tag == 'list':
# List going into a request, which has no length field (inferred by server)
self.lenfield_name = elt.get('name') + '_len'
@@ -61,12 +64,9 @@ class Expression(object):
# Standard list with a fieldref
self.lenfield_name = elt.text
- elif elt.tag == 'valueparam':
- # Value-mask. The length bitmask is described by attributes.
- self.lenfield_name = elt.get('value-mask-name')
- self.lenfield_type = elt.get('value-mask-type')
- self.lenwire = True
- self.bitfield = True
+ elif elt.tag == 'paramref':
+ self.lenfield_name = elt.text
+ self.lenfield_type = elt.get('type')
elif elt.tag == 'op':
# Op field. Need to recurse.
@@ -103,6 +103,17 @@ class Expression(object):
elif elt.tag == 'sumof':
self.op = 'sumof'
self.lenfield_name = elt.get('ref')
+ subexpressions = list(elt)
+ if len(subexpressions) > 0:
+ # sumof with a nested expression which is to be evaluated
+ # for each list-element in the context of that list-element.
+ # sumof then returns the sum of the results of these evaluations
+ self.rhs = Expression(subexpressions[0], parent)
+
+ elif elt.tag == 'listelement-ref':
+ # current list element inside iterating expressions such as sumof
+ self.op = 'listelement-ref'
+ self.contains_listelement_ref = True
else:
# Notreached
@@ -111,6 +122,12 @@ class Expression(object):
def fixed_size(self):
return self.nmemb != None
+ def recursive_resolve_tasks(self, module, parents):
+ for subexpr in (self.lhs, self.rhs):
+ if subexpr != None:
+ subexpr.recursive_resolve_tasks(module, parents)
+ self.contains_listelement_ref |= subexpr.contains_listelement_ref
+
def resolve(self, module, parents):
if self.op == 'enumref':
self.lenfield_type = module.get_type(self.lenfield_name[0])
@@ -127,4 +144,6 @@ class Expression(object):
self.lenfield_parent = p
self.lenfield_type = fields[self.lenfield_name].field_type
break
+
+ self.recursive_resolve_tasks(module, parents)