diff --git a/c/lumbda.h b/c/lumbda.h index 0533ac5..eebf40e 100644 --- a/c/lumbda.h +++ b/c/lumbda.h @@ -478,6 +478,7 @@ typedef struct VMFrame { Value *stack; int stack_len; int stack_cap; + CodeObj *cur_code; /* saved so RET restores it — needed for SELF_TAIL_CALL after a nested call */ } VMFrame; typedef struct FullCont { diff --git a/c/vm.c b/c/vm.c index 0633a31..83708a3 100644 --- a/c/vm.c +++ b/c/vm.c @@ -798,6 +798,7 @@ Value vm_exec(CodeObj *code, Env *env) { f->instrs = instrs; f->ip = ip; f->n_instrs = n_instrs; f->env = env; f->stack = stack.data; f->stack_len = stack.len; f->stack_cap = stack.cap; + f->cur_code = cur_code; env = env_child(cp->env, cp->params, cp->nparams, cp->rest, args_arr, nargs); cur_code = cp->code; @@ -848,6 +849,7 @@ Value vm_exec(CodeObj *code, Env *env) { env = f->env; ul_free(stack.data); stack.data = f->stack; stack.len = f->stack_len; stack.cap = f->stack_cap; + cur_code = f->cur_code; vs_push(&stack, ret); continue; } @@ -862,6 +864,7 @@ Value vm_exec(CodeObj *code, Env *env) { env = f->env; ul_free(stack.data); stack.data = f->stack; stack.len = f->stack_len; stack.cap = f->stack_cap; + cur_code = f->cur_code; vs_push(&stack, ret); continue; } @@ -915,6 +918,7 @@ Value vm_exec(CodeObj *code, Env *env) { f->instrs = instrs; f->ip = ip; f->n_instrs = n_instrs; f->env = env; f->stack = stack.data; f->stack_len = stack.len; f->stack_cap = stack.cap; + f->cur_code = cur_code; Value kargs[1] = {cont_val}; env = env_child(cp->env, cp->params, cp->nparams, cp->rest, kargs, 1); cur_code = cp->code;