From 583e0b431a6581206368968d56287a858d53b10a Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 26 Oct 2021 13:34:44 +0200 Subject: Add initial parameter support for function calls --- src/bytecode/vm.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 0ce6dec..98c94fa 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -19,6 +19,8 @@ typedef struct CallFrame { // Object *locals; // Return counter. u8 *rp; + // Starting point of the locals for this procedure. + size_t stack_offset; } CallFrame; typedef struct VM { @@ -149,8 +151,7 @@ vm_interpret(VM *vm) { return; } - u8 *last = frame->chunk->code + array_size(frame->chunk->code); - while (vm->pc < last) { + while (true) { #ifdef DEBUG_TRACE_EXECUTION printf("stack: [ "); for (size_t i = 0; i < array_size(vm->stack); i++) { @@ -164,6 +165,10 @@ vm_interpret(VM *vm) { #endif u8 instruction = *vm->pc++; switch (instruction) { + case OP_LOCAL: { + u8 local = *vm->pc++; + array_push(vm->stack, vm->stack[frame->stack_offset + local]); + } break; case OP_CONSTANT: { u8 constant = *vm->pc++; Object obj = frame->chunk->constants[constant]; @@ -256,7 +261,11 @@ vm_interpret(VM *vm) { } break; case OP_CALL: { Object proc = array_pop(vm->stack); - CallFrame new_frame = (CallFrame){proc.chunk, vm->pc}; + 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]; vm->pc = frame->chunk->code; @@ -272,6 +281,9 @@ vm_interpret(VM *vm) { } vm->pc = frame->rp; array_head(vm->frames)->size--; + Object ret = array_pop(vm->stack); + array_head(vm->stack)->size = frame->stack_offset; + array_push(vm->stack, ret); frame = &vm->frames[array_size(vm->frames) - 1]; } break; case OP_DROP: { -- cgit v1.2.1