diff options
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 17 |
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; |