summaryrefslogtreecommitdiff
path: root/erts/lib_src/yielding_c_fun/test/examples/multi_scope_yield.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/lib_src/yielding_c_fun/test/examples/multi_scope_yield.c')
-rw-r--r--erts/lib_src/yielding_c_fun/test/examples/multi_scope_yield.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/erts/lib_src/yielding_c_fun/test/examples/multi_scope_yield.c b/erts/lib_src/yielding_c_fun/test/examples/multi_scope_yield.c
new file mode 100644
index 0000000000..87024abe39
--- /dev/null
+++ b/erts/lib_src/yielding_c_fun/test/examples/multi_scope_yield.c
@@ -0,0 +1,93 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB and Kjell Winblad 2019. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+/*
+ * Description:
+ *
+ * Author: Kjell Winblad
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define YCF_YIELD()
+
+
+int fun(char x){
+ long y = x + 1; /* y == 2*/
+ YCF_YIELD();
+ {
+ int x = 10;
+ YCF_YIELD();
+ y = y + x; /* y == 12*/
+ YCF_YIELD();
+ {
+ long x = 30;
+ YCF_YIELD();
+ y = y + x; /* y == 42*/
+ YCF_YIELD();
+ }
+ YCF_YIELD();
+ y = y + x; /* y == 52*/
+ }
+ YCF_YIELD();
+ y = y + x; /* y == 53*/
+ YCF_YIELD();
+ return y;
+}
+
+void* allocator(size_t size, void* context){
+ (void)context;
+ return malloc(size);
+}
+
+void freer(void* data, void* context){
+ (void)context;
+ free(data);
+}
+
+int main( int argc, const char* argv[] )
+{
+#ifdef YCF_YIELD_CODE_GENERATED
+ void* wb = NULL;
+#endif
+ int ret = 0;
+ long nr_of_reductions = 1;
+#ifdef YCF_YIELD_CODE_GENERATED
+ do{
+ ret = fun_ycf_gen_yielding(&nr_of_reductions,&wb,NULL,allocator,freer,NULL,0,NULL,1);
+ if(wb != NULL){
+ printf("TRAPPED\n");
+ }
+ }while(wb != NULL);
+ if(wb != NULL){
+ free(wb);
+ }
+#else
+ fun(1);
+#endif
+ printf("RETURNED %d\n", ret);
+ if(ret != 53){
+ return 1;
+ }else{
+ return 0;
+ }
+}