xcbgen: sumof with nested expression
[free-sw/xcb/proto] / xcbgen / expr.py
index 4f8af6f..a03703f 100644 (file)
@@ -13,7 +13,7 @@ class Field(object):
     auto is true iff the field is on the wire but not in the request API (e.g. opcode)
     enum is the enum name this field refers to, if any.
     '''
     auto is true iff the field is on the wire but not in the request API (e.g. opcode)
     enum is the enum name this field refers to, if any.
     '''
-    def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None):
+    def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None, isfd=False):
         self.type = type
         self.field_type = field_type
         self.field_name = field_name
         self.type = type
         self.field_type = field_type
         self.field_name = field_name
@@ -21,6 +21,8 @@ class Field(object):
         self.visible = visible
         self.wire = wire
         self.auto = auto
         self.visible = visible
         self.wire = wire
         self.auto = auto
+        self.isfd = isfd
+        self.parent = None
 
 
 class Expression(object):
 
 
 class Expression(object):
@@ -102,6 +104,12 @@ class Expression(object):
         elif elt.tag == 'sumof':
             self.op = 'sumof'
             self.lenfield_name = elt.get('ref')
         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)
 
         else:
             # Notreached
 
         else:
             # Notreached
@@ -119,7 +127,7 @@ class Expression(object):
             for p in reversed(parents): 
                 fields = dict([(f.field_name, f) for f in p.fields])
                 if self.lenfield_name in fields.keys():
             for p in reversed(parents): 
                 fields = dict([(f.field_name, f) for f in p.fields])
                 if self.lenfield_name in fields.keys():
-                    if p.is_bitcase:
+                    if p.is_case_or_bitcase:
                         # switch is the anchestor 
                         self.lenfield_parent = p.parents[-1]
                     else:
                         # switch is the anchestor 
                         self.lenfield_parent = p.parents[-1]
                     else: