diff options
Diffstat (limited to 'src/bytecode')
-rwxr-xr-x | src/bytecode/vm.h | 10 |
1 files changed, 7 insertions, 3 deletions
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) { | |||
278 | array_push(vm->frames, new_frame); | 278 | array_push(vm->frames, new_frame); |
279 | frame = &vm->frames[array_size(vm->frames) - 1]; | 279 | frame = &vm->frames[array_size(vm->frames) - 1]; |
280 | } else { | 280 | } else { |
281 | // TODO: restore all parameters. | 281 | // Bind tail-call parameters. |
282 | Object a = array_pop(vm->stack); | 282 | for (size_t i = 0; i < (size_t)n_params; i++) { |
283 | vm->stack[frame->stack_offset] = a; | 283 | Object obj = array_peek(vm->stack, n_params - 1 - i); |
284 | vm->stack[frame->stack_offset + i] = obj; | ||
285 | } | ||
286 | // Reset stack size. | ||
287 | array_head(vm->stack)->size = frame->stack_offset + n_params; | ||
284 | } | 288 | } |
285 | vm->pc = frame->chunk->code; | 289 | vm->pc = frame->chunk->code; |
286 | } break; | 290 | } break; |