Allocate Fur stacks on the C heap
[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
8   jmp_buf jump;
9   if(setjmp(jump) != 0)
10   {
11     fprintf(stderr, "\tin {{name}}\n");
12
13     while(Stack_any(stack))
14     {
15       Object item = Stack_pop(stack);
16       Object_deinitialize(&item);
17     }
18     Environment_setLive(environment, false);
19
20     Stack_destruct(stack);
21
22     longjmp(parentJump, 1);
23   }
24
25   Object result = builtin$nil;
26
27   {% for argument_name in argument_name_list|reverse %}
28   Environment_set(environment, "{{ argument_name }}", Stack_pop(parentStack));
29   {% endfor %}
30
31   {% for statement in statement_list %}
32   {{ statement }}
33   {% endfor %}
34
35   // TODO Set the environment back to the parent environment
36   Environment_setLive(environment, false);
37
38   Stack_destruct(stack);
39   return result;
40 }