generator: support listelement-ref
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" Message-ID: <545743A0.50907@DemoRecorder.com> Patch-Thread-Subject: [Xcb] support popcount of a list and associated xml changes Patch-Set: PopcountList Patch-Number: libxcb 4/4 Patch-Version: V4 Signed-off-by: Christian Linhart <chris@DemoRecorder.com>
This commit is contained in:
parent
422458b663
commit
912cd97a6d
|
@ -1646,6 +1646,14 @@ def _c_accessor_get_expr(expr, field_mapping):
|
||||||
_c_pre.code("for (%s = 0; %s < %s; %s++) {", loopvar, loopvar, lengthvar, loopvar)
|
_c_pre.code("for (%s = 0; %s < %s; %s++) {", loopvar, loopvar, lengthvar, loopvar)
|
||||||
_c_pre.indent()
|
_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:
|
if expr.rhs is None:
|
||||||
_c_pre.code("%s += *%s;", sumvar, listvar)
|
_c_pre.code("%s += *%s;", sumvar, listvar)
|
||||||
else:
|
else:
|
||||||
|
@ -1655,10 +1663,11 @@ def _c_accessor_get_expr(expr, field_mapping):
|
||||||
# field mapping for the subexpression needs to include
|
# field mapping for the subexpression needs to include
|
||||||
# the fields of the list-member type
|
# the fields of the list-member type
|
||||||
scoped_field_mapping = field_mapping.copy()
|
scoped_field_mapping = field_mapping.copy()
|
||||||
scoped_field_mapping.update(
|
if not field.type.member.is_simple:
|
||||||
_c_helper_field_mapping(
|
scoped_field_mapping.update(
|
||||||
field.type.member,
|
_c_helper_field_mapping(
|
||||||
[(listvar, '->', field.type.member)]))
|
field.type.member,
|
||||||
|
[(listvar, '->', field.type.member)]))
|
||||||
|
|
||||||
# cause pre-code of the subexpression be added right here
|
# cause pre-code of the subexpression be added right here
|
||||||
_c_pre.end()
|
_c_pre.end()
|
||||||
|
@ -1675,6 +1684,8 @@ def _c_accessor_get_expr(expr, field_mapping):
|
||||||
_c_pre.code("/* sumof end. Result is in %s */", sumvar)
|
_c_pre.code("/* sumof end. Result is in %s */", sumvar)
|
||||||
_c_pre.end()
|
_c_pre.end()
|
||||||
return sumvar
|
return sumvar
|
||||||
|
elif expr.op == 'listelement-ref':
|
||||||
|
return '(*xcb_listelement)'
|
||||||
elif expr.op != None:
|
elif expr.op != None:
|
||||||
return ('(' + _c_accessor_get_expr(expr.lhs, field_mapping) +
|
return ('(' + _c_accessor_get_expr(expr.lhs, field_mapping) +
|
||||||
' ' + expr.op + ' ' +
|
' ' + expr.op + ' ' +
|
||||||
|
|
Loading…
Reference in New Issue