aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode
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
parent8f9a84345c147da5d398331548753d1e350ce846 (diff)
downloadbdl-634272f023a3123bc296690bc2dadd874b601ca9.tar.gz
bdl-634272f023a3123bc296690bc2dadd874b601ca9.zip
Add OP_GET_GLOBAL and symbol resolution for globals
Diffstat (limited to 'src/bytecode')
-rwxr-xr-xsrc/bytecode/compiler.h6
-rwxr-xr-xsrc/bytecode/debug.h1
-rwxr-xr-xsrc/bytecode/ops.h1
-rwxr-xr-xsrc/bytecode/vm.h17
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;