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