From 634272f023a3123bc296690bc2dadd874b601ca9 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 24 Oct 2021 12:24:29 +0200 Subject: Add OP_GET_GLOBAL and symbol resolution for globals --- src/bytecode/vm.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 23370bb..de025c1 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -54,6 +54,14 @@ vm_reset(VM *vm) { .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \ }) +#define SYMBOL_NOT_FOUND_ERR() \ + error_push((Error){ \ + .type = ERR_TYPE_RUNTIME, \ + .value = ERR_SYMBOL_NOT_FOUND, \ + .line = vm->chunk->lines[vm->pc - vm->chunk->code - 1].line, \ + .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \ + }) + #define FIXNUM_ARITHMETIC_OP(OP) \ do { \ ssize_t n = AS_FIXNUM(array_pop(vm->stack)); \ @@ -152,6 +160,15 @@ vm_interpret(VM *vm, Chunk *chunk) { Object name = array_pop(vm->stack); ht_insert(vm->globals, name, value); } break; + case OP_GET_GLOBAL: { + Object name = array_pop(vm->stack); + Object *value = ht_lookup(vm->globals, name); + if (value == NULL) { + SYMBOL_NOT_FOUND_ERR(); + return; + } + array_push(vm->stack, *value); + } break; case OP_SUM: { FIXNUM_ARITHMETIC_OP(+); } break; case OP_SUB: { FIXNUM_ARITHMETIC_OP(-); } break; case OP_MUL: { FIXNUM_ARITHMETIC_OP(*); } break; -- cgit v1.2.1