X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;f=templates%2Ffunction_definition.c;h=fb7a090ffb5551ea40289b187150428ca20098e1;hb=71e31cb70ae58b776dd646c87db37d0250bb63de;hp=0c60f3082eef5c77a1f9659945928bc7a87c6db5;hpb=a96e96f3f783930707122f691cd6a08a90416a74;p=fur diff --git a/templates/function_definition.c b/templates/function_definition.c index 0c60f30..fb7a090 100644 --- a/templates/function_definition.c +++ b/templates/function_definition.c @@ -1,14 +1,21 @@ -Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environment* parent, size_t argc, Object* args) +Object user${{name}}$implementation(EnvironmentPool* environmentPool, Environment* parent, size_t argc, Stack* stack, jmp_buf parent_jump) { - assert(argc == {{ argument_name_list|length }}); - Environment* environment = EnvironmentPool_allocate(environmentPool); Environment_initialize(environment, parent); + + jmp_buf jump; + if(setjmp(jump) != 0) + { + Environment_setLive(environment, false); + fprintf(stderr, "Error in {{name}}\n"); + longjmp(parent_jump, 1); + } + Object result = builtin$nil; - {% for argument_name in argument_name_list %} - Environment_set(environment, "{{ argument_name }}", args[{{ loop.index0 }}]); + {% for argument_name in argument_name_list|reverse %} + Environment_set(environment, "{{ argument_name }}", Stack_pop(stack)); {% endfor %} {% for statement in statement_list %}