diff options
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 10 |
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 | ||
21 | void vm_init(VM *vm); | 24 | void vm_init(VM *vm); |
@@ -27,11 +30,13 @@ void | |||
27 | vm_init(VM *vm) { | 30 | vm_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 | ||
32 | void | 36 | void |
33 | vm_free(VM *vm) { | 37 | vm_free(VM *vm) { |
34 | array_free(vm->stack); | 38 | array_free(vm->stack); |
39 | ht_free(vm->globals); | ||
35 | } | 40 | } |
36 | 41 | ||
37 | void | 42 | void |
@@ -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; |