aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-24 12:24:29 +0200
committerBad Diode <bd@badd10de.dev>2021-10-24 12:24:29 +0200
commit634272f023a3123bc296690bc2dadd874b601ca9 (patch)
tree8cc06b573b71f6014be691eaaf206f3159238609 /src/bytecode/vm.h
parent8f9a84345c147da5d398331548753d1e350ce846 (diff)
downloadbdl-634272f023a3123bc296690bc2dadd874b601ca9.tar.gz
bdl-634272f023a3123bc296690bc2dadd874b601ca9.zip
Add OP_GET_GLOBAL and symbol resolution for globals
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-xsrc/bytecode/vm.h17
1 files changed, 17 insertions, 0 deletions
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) {
54 .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \ 54 .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \
55 }) 55 })
56 56
57#define SYMBOL_NOT_FOUND_ERR() \
58 error_push((Error){ \
59 .type = ERR_TYPE_RUNTIME, \
60 .value = ERR_SYMBOL_NOT_FOUND, \
61 .line = vm->chunk->lines[vm->pc - vm->chunk->code - 1].line, \
62 .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \
63 })
64
57#define FIXNUM_ARITHMETIC_OP(OP) \ 65#define FIXNUM_ARITHMETIC_OP(OP) \
58 do { \ 66 do { \
59 ssize_t n = AS_FIXNUM(array_pop(vm->stack)); \ 67 ssize_t n = AS_FIXNUM(array_pop(vm->stack)); \
@@ -152,6 +160,15 @@ vm_interpret(VM *vm, Chunk *chunk) {
152 Object name = array_pop(vm->stack); 160 Object name = array_pop(vm->stack);
153 ht_insert(vm->globals, name, value); 161 ht_insert(vm->globals, name, value);
154 } break; 162 } break;
163 case OP_GET_GLOBAL: {
164 Object name = array_pop(vm->stack);
165 Object *value = ht_lookup(vm->globals, name);
166 if (value == NULL) {
167 SYMBOL_NOT_FOUND_ERR();
168 return;
169 }
170 array_push(vm->stack, *value);
171 } break;
155 case OP_SUM: { FIXNUM_ARITHMETIC_OP(+); } break; 172 case OP_SUM: { FIXNUM_ARITHMETIC_OP(+); } break;
156 case OP_SUB: { FIXNUM_ARITHMETIC_OP(-); } break; 173 case OP_SUB: { FIXNUM_ARITHMETIC_OP(-); } break;
157 case OP_MUL: { FIXNUM_ARITHMETIC_OP(*); } break; 174 case OP_MUL: { FIXNUM_ARITHMETIC_OP(*); } break;