[Xcb] [PATCH libxcb 4/4 V4] generator: support listelement-ref

Christian Linhart chris at DemoRecorder.com
Mon Nov 3 00:58:08 PST 2014


Support for listelement-ref needs the following three changes
(in the order as they appear in the patch):

* making the current list-element accessible with the variable
  xcb_listelement which is a pointer to the list-element

* supporting lists of simple-type for sumof with a nested expression

* using the variable for resolving a listelement-ref expression

Changes for V2 of this patch:
- adapt to removal of patch "libxcb 2/6" from patchset "ListInputDevices".

Changes for V3 of this patch:
- adapt to V2 of patch "libxcb 5/6" from patchset "ListInputDevices"

Changes for V4 of this patch:
- adapt to revision 2 of the patchset "ListInputDevices"

---
 src/c_client.py | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/c_client.py b/src/c_client.py
index bd14959..fa0d2fc 100644
--- a/src/c_client.py
+++ b/src/c_client.py
@@ -1645,24 +1645,33 @@ def _c_accessor_get_expr(expr, field_mapping):
         _c_pre.code("%s = %s;", listvar, list_name)
         _c_pre.code("for (%s = 0; %s < %s; %s++) {", loopvar, loopvar, lengthvar, loopvar)
         _c_pre.indent()
 
+        # define and set xcb_listelement, so that it can be used by
+        # listelement-ref expressions.
+        if expr.contains_listelement_ref:
+            _c_pre.code(
+                "const %s *xcb_listelement = %s;",
+                field.c_field_type, listvar)
+
+        # summation
         if expr.rhs is None:
             _c_pre.code("%s += *%s;", sumvar, listvar)
         else:
             # sumof has a nested expression which has to be evaluated in
             # the context of this list element
 
             # field mapping for the subexpression needs to include
             # the fields of the list-member type
             scoped_field_mapping = field_mapping.copy()
-            scoped_field_mapping.update(
-                _c_helper_field_mapping(
-                    field.type.member,
-                    [(listvar, '->', field.type.member)]))
+            if not field.type.member.is_simple:
+                scoped_field_mapping.update(
+                    _c_helper_field_mapping(
+                        field.type.member,
+                        [(listvar, '->', field.type.member)]))
 
             # cause pre-code of the subexpression be added right here
             _c_pre.end()
             # compute the subexpression
             rhs_expr_str = _c_accessor_get_expr(expr.rhs, scoped_field_mapping)
             # resume with our code
             _c_pre.start()
@@ -1672,13 +1681,15 @@ def _c_accessor_get_expr(expr, field_mapping):
         _c_pre.code("%s++;", listvar)
         _c_pre.pop_indent()
         _c_pre.code("}")
         _c_pre.code("/* sumof end. Result is in %s */", sumvar)
         _c_pre.end()
         return sumvar
+    elif expr.op == 'listelement-ref':
+        return '(*xcb_listelement)'
     elif expr.op != None:
         return ('(' + _c_accessor_get_expr(expr.lhs, field_mapping) +
                 ' ' + expr.op + ' ' +
                 _c_accessor_get_expr(expr.rhs, field_mapping) + ')')
     elif expr.bitfield:
         return 'xcb_popcount(' + lenexp + ')'
     else:
--
2.0.1


More information about the Xcb mailing list