Use snapshots of the stack to restore stack to its previous state
[fur] / templates / function_definition.c
1
2 Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environment* environment, size_t argc, Stack* parentStack, jmp_buf parentJump)
3 {
4   environment = Environment_construct(environmentPool, environment);
5
6   Stack* stack = Stack_construct();
7   StackSnapshot stackSnapshot = Stack_takeSnapshot(stack);
8
9   jmp_buf jump;
10   if(setjmp(jump) != 0)
11   {
12     fprintf(stderr, "\tin {{name}}\n");
13
14     Stack_rewind(stack, stackSnapshot);
15     Environment_setLive(environment, false);
16
17     Stack_destruct(stack);
18
19     longjmp(parentJump, 1);
20   }
21
22   Object result = builtin$nil;
23
24   {% for argument_name in argument_name_list|reverse %}
25   Environment_set(environment, "{{ argument_name }}", Stack_pop(parentStack));
26   {% endfor %}
27
28   {% for statement in statement_list %}
29   {{ statement }}
30   {% endfor %}
31
32   // TODO Set the environment back to the parent environment
33   Environment_setLive(environment, false);
34
35   Stack_destruct(stack);
36   return result;
37 }