Add a very basic optimization pass
[fur] / templates / function_definition.c
1
2 Object user${{name}}${{index}}$implementation(
3     EnvironmentPool* environmentPool,
4     Environment* environment,
5     size_t argc,
6     Stack* stack,
7     const unsigned long line,
8     jmp_buf parentJump)
9 {
10   environment = Environment_construct(environmentPool, environment);
11
12   StackSnapshot stackSnapshot = Stack_takeSnapshot(stack);
13
14   jmp_buf jump;
15   if(setjmp(jump) != 0)
16   {
17     fprintf(stderr, "\tin {{name}} on line %zu\n", line);
18
19     Stack_rewind(stack, stackSnapshot);
20     Environment_setLive(environment, false);
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(stack));
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   return result;
38 }