X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=templates%2Ffunction_definition.c;h=9ebac36d4213e60de2d5b66b54a005864c6a3453;hp=72ce6f0d8e7d1d16e03ac5e42090ccefc7b39f2f;hb=4c47216656579a0e5b81cc3fbab17362ffde3e94;hpb=85dd9abe3cd977cd7f9bdeb9aea15c5b4135d0b2 diff --git a/templates/function_definition.c b/templates/function_definition.c index 72ce6f0..9ebac36 100644 --- a/templates/function_definition.c +++ b/templates/function_definition.c @@ -1,21 +1,32 @@ -Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environment* parent, size_t argc, Stack* stack, jmp_buf parent_jump) +Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environment* parent, size_t argc, Stack* parentStack, jmp_buf parent_jump) { Environment* environment = EnvironmentPool_allocate(environmentPool); Environment_initialize(environment, parent); + Stack stackMemory; + Stack* stack = &stackMemory; + Stack_initialize(stack); + jmp_buf jump; if(setjmp(jump) != 0) { - Environment_setLive(environment, false); fprintf(stderr, "\tin {{name}}\n"); + + while(Stack_any(stack)) + { + Object item = Stack_pop(stack); + Object_deinitialize(&item); + } + Environment_setLive(environment, false); + longjmp(parent_jump, 1); } Object result = builtin$nil; {% for argument_name in argument_name_list|reverse %} - Environment_set(environment, "{{ argument_name }}", Stack_pop(stack)); + Environment_set(environment, "{{ argument_name }}", Stack_pop(parentStack)); {% endfor %} {% for statement in statement_list %}