9ebac36d4213e60de2d5b66b54a005864c6a3453
[fur] / templates / function_definition.c
1
2 Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environment* parent, size_t argc, Stack* parentStack, jmp_buf parent_jump)
3 {
4   Environment* environment = EnvironmentPool_allocate(environmentPool);
5   Environment_initialize(environment, parent);
6
7   Stack stackMemory;
8   Stack* stack = &stackMemory;
9   Stack_initialize(stack);
10
11   jmp_buf jump;
12   if(setjmp(jump) != 0)
13   {
14     fprintf(stderr, "\tin {{name}}\n");
15
16     while(Stack_any(stack))
17     {
18       Object item = Stack_pop(stack);
19       Object_deinitialize(&item);
20     }
21     Environment_setLive(environment, false);
22
23     longjmp(parent_jump, 1);
24   }
25
26   Object result = builtin$nil;
27
28   {% for argument_name in argument_name_list|reverse %}
29   Environment_set(environment, "{{ argument_name }}", Stack_pop(parentStack));
30   {% endfor %}
31
32   {% for statement in statement_list %}
33   {{ statement }}
34   {% endfor %}
35
36   Environment_setLive(environment, false);
37   return result;
38 }