aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-xsrc/bytecode/vm.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h
index f1886ec..23370bb 100755
--- a/src/bytecode/vm.h
+++ b/src/bytecode/vm.h
@@ -6,6 +6,7 @@
6#include "chunk.h" 6#include "chunk.h"
7#include "ops.h" 7#include "ops.h"
8#include "debug.h" 8#include "debug.h"
9#include "hashtable.h"
9 10
10#define VM_STACK_CAP 1024 11#define VM_STACK_CAP 1024
11 12
@@ -16,6 +17,8 @@ typedef struct VM {
16 u8 *pc; 17 u8 *pc;
17 // Stack. 18 // Stack.
18 Object *stack; 19 Object *stack;
20 // Global variables.
21 HashTable *globals;
19} VM; 22} VM;
20 23
21void vm_init(VM *vm); 24void vm_init(VM *vm);
@@ -27,11 +30,13 @@ void
27vm_init(VM *vm) { 30vm_init(VM *vm) {
28 *vm = (VM){0}; 31 *vm = (VM){0};
29 array_init(vm->stack, VM_STACK_CAP); 32 array_init(vm->stack, VM_STACK_CAP);
33 vm->globals = ht_init();
30} 34}
31 35
32void 36void
33vm_free(VM *vm) { 37vm_free(VM *vm) {
34 array_free(vm->stack); 38 array_free(vm->stack);
39 ht_free(vm->globals);
35} 40}
36 41
37void 42void
@@ -142,6 +147,11 @@ vm_interpret(VM *vm, Chunk *chunk) {
142 Object obj = vm->chunk->constants[constant]; 147 Object obj = vm->chunk->constants[constant];
143 array_push(vm->stack, obj); 148 array_push(vm->stack, obj);
144 } break; 149 } break;
150 case OP_DEF: {
151 Object value = array_pop(vm->stack);
152 Object name = array_pop(vm->stack);
153 ht_insert(vm->globals, name, value);
154 } break;
145 case OP_SUM: { FIXNUM_ARITHMETIC_OP(+); } break; 155 case OP_SUM: { FIXNUM_ARITHMETIC_OP(+); } break;
146 case OP_SUB: { FIXNUM_ARITHMETIC_OP(-); } break; 156 case OP_SUB: { FIXNUM_ARITHMETIC_OP(-); } break;
147 case OP_MUL: { FIXNUM_ARITHMETIC_OP(*); } break; 157 case OP_MUL: { FIXNUM_ARITHMETIC_OP(*); } break;