From b33b00390c605c74426b8376b4a71e17af4754fc Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 26 Oct 2021 13:59:51 +0200 Subject: Add initial tail-call optimization --- src/bytecode/vm.h | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 98c94fa..6c44fc6 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -261,13 +261,21 @@ vm_interpret(VM *vm) { } break; case OP_CALL: { Object proc = array_pop(vm->stack); - CallFrame new_frame = (CallFrame){ - .chunk = proc.chunk, - .rp = vm->pc, - .stack_offset = array_size(vm->stack) - array_size(proc.chunk->params), - }; - array_push(vm->frames, new_frame); - frame = &vm->frames[array_size(vm->frames) - 1]; + + // Tail-call optimization. + if (proc.chunk != frame->chunk || *vm->pc != OP_RETURN) { + CallFrame new_frame = (CallFrame){ + .chunk = proc.chunk, + .rp = vm->pc, + .stack_offset = array_size(vm->stack) - array_size(proc.chunk->params), + }; + 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; + } vm->pc = frame->chunk->code; } break; case OP_RETURN: { -- cgit v1.2.1