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/compiler.h | 6 ++++++ src/bytecode/debug.h | 1 + src/bytecode/ops.h | 1 + src/bytecode/vm.h | 17 +++++++++++++++++ 4 files changed, 25 insertions(+) (limited to 'src') diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index 8f3fa81..47e7859 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -90,6 +90,9 @@ compile_list_binary_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { break; } parse_tree(chunk, vs); + if (tok.type == TOKEN_SYMBOL) { + add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); + } n++; } emit_constant(chunk, start, FIXNUM_VAL(n)); @@ -123,6 +126,9 @@ compile_list_unary_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { return; } parse_tree(chunk, vs); + if (tok.type == TOKEN_SYMBOL) { + add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); + } add_code(chunk, op, start.line, start.column); n++; if (n > 1) { diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h index 52b237a..dc0585b 100755 --- a/src/bytecode/debug.h +++ b/src/bytecode/debug.h @@ -10,6 +10,7 @@ static const char* ops_str[] = { // Load/store ops. [OP_CONSTANT] = "OP_CONSTANT", [OP_DEF] = "OP_DEF", + [OP_GET_GLOBAL] = "OP_GET_GLOBAL", // Arithmetic ops. [OP_SUM] = "OP_SUM", [OP_SUB] = "OP_SUB", diff --git a/src/bytecode/ops.h b/src/bytecode/ops.h index 63442ac..783d3cf 100755 --- a/src/bytecode/ops.h +++ b/src/bytecode/ops.h @@ -5,6 +5,7 @@ typedef enum Ops { // Load/store ops. OP_CONSTANT, OP_DEF, + OP_GET_GLOBAL, // Arithmetic ops. OP_SUM, OP_SUB, 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