From 6445d865ab391e3f705c41839df12f9e294eb840 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 26 Oct 2021 15:35:36 +0200 Subject: Fix parameter binding on TCO calls --- src/bytecode/vm.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index ed54046..33582b1 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -278,9 +278,13 @@ vm_interpret(VM *vm) { array_push(vm->frames, new_frame); frame = &vm->frames[array_size(vm->frames) - 1]; } else { - // TODO: restore all parameters. - Object a = array_pop(vm->stack); - vm->stack[frame->stack_offset] = a; + // Bind tail-call parameters. + for (size_t i = 0; i < (size_t)n_params; i++) { + Object obj = array_peek(vm->stack, n_params - 1 - i); + vm->stack[frame->stack_offset + i] = obj; + } + // Reset stack size. + array_head(vm->stack)->size = frame->stack_offset + n_params; } vm->pc = frame->chunk->code; } break; -- cgit v1.2.1