summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Linhart <chris@DemoRecorder.com>2014-11-02 13:46:16 +0100
committerChristian Linhart <chris@demorecorder.com>2014-11-03 11:23:16 +0100
commit51a0d57acc6ec0c9487d2dbc2dda806f05c49884 (patch)
tree272a5e5235f00aa3b88272b2a41214623baad343
parent4a915c0dbadf326ea61349e29a0029d29f4bd339 (diff)
generator: sumof with nested expression
Support sumof with a nested expression. The nested expression is computed for every list-element and the result of the computation is added to the sum. This way, sumof can be applied to a list of structs, and, e.g., compute the sum of a specific field of that struct. example: <struct name="SumofTest_Element"> <field type="CARD16" name="foo" /> <field type="CARD16" name="bar" /> </struct> <struct name="SumofTest_FieldAccess"> <field type="CARD32" name="len" /> <list type="SumofTest_Element" name="mylist1"> <fieldref>len</fieldref> </list> <list type="CARD16" name="mylist2"> <sumof ref="mylist1"> <fieldref>bar</fieldref> </sumof> </list> </struct> generated tmpvar: int xcb_pre_tmp_1; /* sumof length */ int xcb_pre_tmp_2; /* sumof loop counter */ int64_t xcb_pre_tmp_3; /* sumof sum */ const xcb_input_sumof_test_element_t* xcb_pre_tmp_4; /* sumof list ptr */ generated code: /* mylist2 */ /* sumof start */ xcb_pre_tmp_1 = _aux->len; xcb_pre_tmp_3 = 0; xcb_pre_tmp_4 = xcb_input_sumof_test_field_access_mylist_1(_aux); for ( xcb_pre_tmp_2 = 0; xcb_pre_tmp_2 < xcb_pre_tmp_1; xcb_pre_tmp_2++) { xcb_pre_tmp_3 += xcb_pre_tmp_4->bar; xcb_pre_tmp_4++; } /* sumof end. Result is in xcb_pre_tmp_3 */ xcb_block_len += xcb_pre_tmp_3 * sizeof(uint16_t); changes for V2 of this patch: * explicitely set the member access operator in the prefix-tuple passed to function _c_helper_field_mapping. This enables us to simplify function "_c_helper_absolute_name" (which will be renamed "_c_helper_fieldaccess_expr" soon) V3: Changed style and formatting according to suggestions from Ran Benita Signed-off-by: Christian Linhart <chris@DemoRecorder.com> Reviewed-by: Ran Benita <ran234@gmail.com> Message-ID: <54562798.8040500@DemoRecorder.com> Patch-Thread-Subject: [Xcb] [PATCHSET] ListInputDevices revision 2 Patch-Set: ListInputDevices Patch-Number: libxcb 5/9 Patch-Version: V3
-rw-r--r--src/c_client.py25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/c_client.py b/src/c_client.py
index 0fae837..eae1f6c 100644
--- a/src/c_client.py
+++ b/src/c_client.py
@@ -1646,7 +1646,30 @@ 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()
- _c_pre.code("%s += *%s;", sumvar, listvar)
+
+ 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)]))
+
+ # 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()
+ # output the summation expression
+ _c_pre.code("%s += %s;", sumvar, rhs_expr_str)
+
_c_pre.code("%s++;", listvar)
_c_pre.pop_indent()
_c_pre.code("}")