From ad659dca44892a5f2ba4e088603a819af58a5819 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 27 Oct 2021 13:59:25 +0200 Subject: Add support for lexically scoped local variables --- src/bytecode/vm.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 84d2432..287c83c 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -188,6 +188,13 @@ vm_interpret(VM *vm) { ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); vm->stack[frame->stack_offset + idx] = value; } break; + case OP_SET_LOCAL: { + Object value = array_pop(vm->stack); + ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); + ssize_t depth = AS_FIXNUM(array_pop(vm->stack)); + CallFrame frame = vm->frames[depth]; + vm->stack[frame.stack_offset + idx] = value; + } break; case OP_DEF: { Object value = array_pop(vm->stack); Object name = array_pop(vm->stack); @@ -280,13 +287,13 @@ vm_interpret(VM *vm) { // Check the number of arguments is correct. // NOTE: This is probably better handled at compilation, but for // now this is simpler to implement. - ssize_t n_params = array_size(proc.chunk->params); + ssize_t n_params = proc.chunk->n_params; + ssize_t n_locals = proc.chunk->n_locals; if (n_args < n_params) { RUNTIME_ERROR(ERR_NOT_ENOUGH_ARGS); } else if (n_args > n_params) { RUNTIME_ERROR(ERR_TOO_MANY_ARGS); } - ssize_t n_locals = array_size(proc.chunk->locals) - n_params; #ifdef DEBUG disassemble_chunk(proc.chunk); @@ -298,7 +305,7 @@ vm_interpret(VM *vm) { CallFrame new_frame = (CallFrame){ .chunk = proc.chunk, .rp = vm->pc, - .stack_offset = array_size(vm->stack) - array_size(proc.chunk->params), + .stack_offset = array_size(vm->stack) - n_params, }; array_push(vm->frames, new_frame); frame = &vm->frames[array_size(vm->frames) - 1]; @@ -315,7 +322,8 @@ vm_interpret(VM *vm) { } // Reset stack size. - array_head(vm->stack)->size = frame->stack_offset + n_params + n_locals; + size_t offset = frame->stack_offset + n_params + n_locals; + array_head(vm->stack)->size = offset; } vm->pc = frame->chunk->code; } break; -- cgit v1.2.1