X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;f=templates%2Ffunction_definition.c;h=ccf3e7596923a252cb4142c2906b350b958781aa;hb=c7f381fbcb57ba1b7e33558a28fdb34f31234c07;hp=72ce6f0d8e7d1d16e03ac5e42090ccefc7b39f2f;hpb=bca87656ab93d4b99b4b007bfd54580bdb19f9dc;p=fur diff --git a/templates/function_definition.c b/templates/function_definition.c index 72ce6f0..ccf3e75 100644 --- a/templates/function_definition.c +++ b/templates/function_definition.c @@ -1,15 +1,25 @@ -Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environment* parent, size_t argc, Stack* stack, jmp_buf parent_jump) +Object user${{name}}${{index}}$implementation( + EnvironmentPool* environmentPool, + Environment* environment, + size_t argc, + Stack* stack, + const unsigned long line, + jmp_buf parentJump) { - Environment* environment = EnvironmentPool_allocate(environmentPool); - Environment_initialize(environment, parent); + environment = Environment_construct(environmentPool, environment); + + StackSnapshot stackSnapshot = Stack_takeSnapshot(stack); jmp_buf jump; if(setjmp(jump) != 0) { + fprintf(stderr, "\tin {{name}} on line %zu\n", line); + + Stack_rewind(stack, stackSnapshot); Environment_setLive(environment, false); - fprintf(stderr, "\tin {{name}}\n"); - longjmp(parent_jump, 1); + + longjmp(parentJump, 1); } Object result = builtin$nil; @@ -22,6 +32,7 @@ Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environmen {{ statement }} {% endfor %} + // TODO Set the environment back to the parent environment Environment_setLive(environment, false); return result; }