diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/bytecode/compiler.h | 6 | ||||
-rwxr-xr-x | src/bytecode/debug.h | 1 | ||||
-rwxr-xr-x | src/bytecode/ops.h | 1 | ||||
-rwxr-xr-x | src/bytecode/vm.h | 17 |
4 files changed, 25 insertions, 0 deletions
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) { | |||
90 | break; | 90 | break; |
91 | } | 91 | } |
92 | parse_tree(chunk, vs); | 92 | parse_tree(chunk, vs); |
93 | if (tok.type == TOKEN_SYMBOL) { | ||
94 | add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); | ||
95 | } | ||
93 | n++; | 96 | n++; |
94 | } | 97 | } |
95 | emit_constant(chunk, start, FIXNUM_VAL(n)); | 98 | emit_constant(chunk, start, FIXNUM_VAL(n)); |
@@ -123,6 +126,9 @@ compile_list_unary_op(Chunk *chunk, Visitor *vs, Token start, Ops op) { | |||
123 | return; | 126 | return; |
124 | } | 127 | } |
125 | parse_tree(chunk, vs); | 128 | parse_tree(chunk, vs); |
129 | if (tok.type == TOKEN_SYMBOL) { | ||
130 | add_code(chunk, OP_GET_GLOBAL, tok.line, tok.column); | ||
131 | } | ||
126 | add_code(chunk, op, start.line, start.column); | 132 | add_code(chunk, op, start.line, start.column); |
127 | n++; | 133 | n++; |
128 | if (n > 1) { | 134 | 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[] = { | |||
10 | // Load/store ops. | 10 | // Load/store ops. |
11 | [OP_CONSTANT] = "OP_CONSTANT", | 11 | [OP_CONSTANT] = "OP_CONSTANT", |
12 | [OP_DEF] = "OP_DEF", | 12 | [OP_DEF] = "OP_DEF", |
13 | [OP_GET_GLOBAL] = "OP_GET_GLOBAL", | ||
13 | // Arithmetic ops. | 14 | // Arithmetic ops. |
14 | [OP_SUM] = "OP_SUM", | 15 | [OP_SUM] = "OP_SUM", |
15 | [OP_SUB] = "OP_SUB", | 16 | [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 { | |||
5 | // Load/store ops. | 5 | // Load/store ops. |
6 | OP_CONSTANT, | 6 | OP_CONSTANT, |
7 | OP_DEF, | 7 | OP_DEF, |
8 | OP_GET_GLOBAL, | ||
8 | // Arithmetic ops. | 9 | // Arithmetic ops. |
9 | OP_SUM, | 10 | OP_SUM, |
10 | OP_SUB, | 11 | 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) { | |||
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; |