[proto,1/1] Calculate length of lengthless lists

Submitted by Jaya Tiwari on March 19, 2015, 7:34 a.m.

Details

Message ID 1426750443-9777-1-git-send-email-tiwari.jaya18@gmail.com
State New
Headers show

Commit Message

Jaya Tiwari March 19, 2015, 7:34 a.m.
Added handling of length less list elements which are the only
variable part of the request.
Such lists that are the only variable part with all other fixed sized
elements declared before it are identified here.

Signed-off-by: Jaya Tiwari <tiwari.jaya18@gmail.com>
---
 xcbgen/xtypes.py | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/xcbgen/xtypes.py b/xcbgen/xtypes.py
index 4d6bbc0..414d3b6 100644
--- a/xcbgen/xtypes.py
+++ b/xcbgen/xtypes.py
@@ -176,16 +176,27 @@  class ListType(Type):
     parent is the structure type containing the list.
     expr is an Expression object containing the length information, for variable-sized lists.
     '''
-    def __init__(self, elt, member, *parent):
+    def __init__(self, elt, member, no_of_var_fields, *parent):
         Type.__init__(self, member.name)
         self.is_list = True
         self.member = member
         self.parents = list(parent)
+        lenfield_name = False
+        has_request = False
+        has_lenfield_ref = False
+        dont_have_len = False
 
         if elt.tag == 'list':
             elts = list(elt)
-            self.expr = Expression(elts[0] if len(elts) else elt, self)
 
+            if 'Request' in str(self.parents):
+                has_request = True
+            if not len(elts) and has_request and no_of_var_fields == 1:
+                self.expr = Expression(elt,self)
+                self.expr.op = 'calculate_len'
+            else:
+                self.expr = Expression(elts[0] if len(elts) else elt, self)
+                
         self.size = member.size if member.fixed_size() else None
         self.nmemb = self.expr.nmemb if self.expr.fixed_size() else None
 
@@ -302,7 +313,11 @@  class ComplexType(Type):
         if self.resolved:
             return
         enum = None
+	no_of_var_fields = 0
 
+	for child in list(self.elt):
+	    if child.tag != 'pad' and child.tag != 'field':
+		no_of_var_fields = no_of_var_fields + 1
         # Resolve all of our field datatypes.
         for child in list(self.elt):
             if child.tag == 'pad':
@@ -325,7 +340,7 @@  class ComplexType(Type):
             elif child.tag == 'list':
                 field_name = child.get('name')
                 fkey = child.get('type')
-                type = ListType(child, module.get_type(fkey), *self.lenfield_parent)
+                type = ListType(child, module.get_type(fkey), no_of_var_fields, *self.lenfield_parent)
                 visible = True
             elif child.tag == 'switch':
                 field_name = child.get('name')