From f0cd7a3cab56a6f8d7b4520aaa168a271a94d6d4 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 27 Oct 2021 10:43:30 +0200 Subject: Add initial implementation of locals --- src/bytecode/vm.h | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 3f59aff..84d2432 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -183,6 +183,11 @@ vm_interpret(VM *vm) { Object obj = frame->chunk->constants[constant]; array_push(vm->stack, obj); } break; + case OP_DEF_LOCAL: { + Object value = array_pop(vm->stack); + ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); + vm->stack[frame->stack_offset + idx] = value; + } break; case OP_DEF: { Object value = array_pop(vm->stack); Object name = array_pop(vm->stack); @@ -281,12 +286,15 @@ vm_interpret(VM *vm) { } else if (n_args > n_params) { RUNTIME_ERROR(ERR_TOO_MANY_ARGS); } + ssize_t n_locals = array_size(proc.chunk->locals) - n_params; - // DEBUG:... - // disassemble_chunk(proc.chunk); +#ifdef DEBUG + disassemble_chunk(proc.chunk); +#endif // Tail-call optimization. if (proc.chunk != frame->chunk || *vm->pc != OP_RETURN) { + // Prepare new call frame. CallFrame new_frame = (CallFrame){ .chunk = proc.chunk, .rp = vm->pc, @@ -294,14 +302,20 @@ vm_interpret(VM *vm) { }; array_push(vm->frames, new_frame); frame = &vm->frames[array_size(vm->frames) - 1]; + + // Prepare local slots. + for (ssize_t i = 0; i < n_locals; i++) { + array_push(vm->stack, NIL_VAL); + } } else { // 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); + for (ssize_t i = 0; i < n_params; i++) { + Object obj = array_peek(vm->stack, n_locals + n_params - 1 - i); vm->stack[frame->stack_offset + i] = obj; } + // Reset stack size. - array_head(vm->stack)->size = frame->stack_offset + n_params; + array_head(vm->stack)->size = frame->stack_offset + n_params + n_locals; } vm->pc = frame->chunk->code; } break; -- cgit v1.2.1