diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-23 16:00:11 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-23 16:00:11 +0200 |
commit | c3fe9367986520b08a36bf693e6c74eb309377c5 (patch) | |
tree | 1974c0cb59a61131c9440fb58757109090ad4cd6 | |
parent | 13f795f8f8aa302ee36ca3974fb80dba29240240 (diff) | |
download | bdl-c3fe9367986520b08a36bf693e6c74eb309377c5.tar.gz bdl-c3fe9367986520b08a36bf693e6c74eb309377c5.zip |
Cleanup macros for arithmetic ops
-rwxr-xr-x | src/bytecode/compiler.h | 16 | ||||
-rwxr-xr-x | src/bytecode/darray.h | 3 | ||||
-rwxr-xr-x | src/bytecode/vm.h | 55 |
3 files changed, 34 insertions, 40 deletions
diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index e48a173..fd5cdbc 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h | |||
@@ -128,11 +128,11 @@ parse_tree(Chunk *chunk, Visitor *vs) { | |||
128 | return ; | 128 | return ; |
129 | } break; | 129 | } break; |
130 | case TOKEN_TRUE: { | 130 | case TOKEN_TRUE: { |
131 | // return obj_true; | 131 | emit_constant(chunk, tok, TRUE_VAL); |
132 | return; | 132 | return; |
133 | } break; | 133 | } break; |
134 | case TOKEN_FALSE: { | 134 | case TOKEN_FALSE: { |
135 | // return obj_false; | 135 | emit_constant(chunk, tok, FALSE_VAL); |
136 | return; | 136 | return; |
137 | } break; | 137 | } break; |
138 | case TOKEN_RPAREN: { | 138 | case TOKEN_RPAREN: { |
@@ -158,16 +158,6 @@ parse_tree(Chunk *chunk, Visitor *vs) { | |||
158 | } break; | 158 | } break; |
159 | case TOKEN_LPAREN: { | 159 | case TOKEN_LPAREN: { |
160 | parse_list(chunk, vs, tok); | 160 | parse_list(chunk, vs, tok); |
161 | // Object *obj = parse_list(vs); | ||
162 | // if (obj == obj_err) { | ||
163 | // error_push((Error){ | ||
164 | // .type = ERR_TYPE_COMPILER, | ||
165 | // .value = ERR_UNBALANCED_PAREN, | ||
166 | // .line = tok.line, | ||
167 | // .col = tok.column, | ||
168 | // }); | ||
169 | // } | ||
170 | // return obj; | ||
171 | return; | 161 | return; |
172 | } break; | 162 | } break; |
173 | case TOKEN_STRING: { | 163 | case TOKEN_STRING: { |
@@ -184,7 +174,7 @@ parse_tree(Chunk *chunk, Visitor *vs) { | |||
184 | return; | 174 | return; |
185 | } break; | 175 | } break; |
186 | case TOKEN_NIL: { | 176 | case TOKEN_NIL: { |
187 | // return obj_nil; | 177 | emit_constant(chunk, tok, NIL_VAL); |
188 | return; | 178 | return; |
189 | } break; | 179 | } break; |
190 | default: { | 180 | default: { |
diff --git a/src/bytecode/darray.h b/src/bytecode/darray.h index db6234d..e8cdc36 100755 --- a/src/bytecode/darray.h +++ b/src/bytecode/darray.h | |||
@@ -25,6 +25,9 @@ typedef struct ArrayHeader { | |||
25 | // Return the last element of the array. Can be used to build stacks. | 25 | // Return the last element of the array. Can be used to build stacks. |
26 | #define array_pop(ARR) (ARR)[--array_head(ARR)->size] | 26 | #define array_pop(ARR) (ARR)[--array_head(ARR)->size] |
27 | 27 | ||
28 | // Return the value stored at the OFFSET position from the tail of the array. | ||
29 | #define array_peek(ARR, OFFSET) (ARR)[array_head(ARR)->size - 1 - (OFFSET)] | ||
30 | |||
28 | // Insert N bytes from the SRC array into the ARR dynamic array. | 31 | // Insert N bytes from the SRC array into the ARR dynamic array. |
29 | #define array_insert(ARR, SRC, N) \ | 32 | #define array_insert(ARR, SRC, N) \ |
30 | ((ARR) = _array_insert(ARR, SRC, N, sizeof(*(ARR)))) | 33 | ((ARR) = _array_insert(ARR, SRC, N, sizeof(*(ARR)))) |
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 581f093..9b68fc1 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h | |||
@@ -40,6 +40,25 @@ vm_reset(VM *vm) { | |||
40 | vm_init(vm); | 40 | vm_init(vm); |
41 | } | 41 | } |
42 | 42 | ||
43 | // Helper macros for a more clear VM switch. | ||
44 | #define FIXNUM_BINARY_OP(OP) \ | ||
45 | do { \ | ||
46 | Object a = array_pop(vm->stack); \ | ||
47 | Object b = array_pop(vm->stack); \ | ||
48 | if (!IS_FIXNUM(a) || !IS_FIXNUM(b)) { \ | ||
49 | error_push((Error){ \ | ||
50 | .type = ERR_TYPE_RUNTIME, \ | ||
51 | .value = ERR_WRONG_ARG_TYPE, \ | ||
52 | .line = vm->chunk->lines[vm->pc - vm->chunk->code - 1].line, \ | ||
53 | .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \ | ||
54 | }); \ | ||
55 | return; \ | ||
56 | } \ | ||
57 | ssize_t x = AS_FIXNUM(a); \ | ||
58 | ssize_t y = AS_FIXNUM(b); \ | ||
59 | array_push(vm->stack, FIXNUM_VAL(y OP x)); \ | ||
60 | } while (false) | ||
61 | |||
43 | void | 62 | void |
44 | vm_interpret(VM *vm, Chunk *chunk) { | 63 | vm_interpret(VM *vm, Chunk *chunk) { |
45 | vm->chunk = chunk; | 64 | vm->chunk = chunk; |
@@ -73,31 +92,11 @@ vm_interpret(VM *vm, Chunk *chunk) { | |||
73 | Object obj = vm->chunk->constants[constant]; | 92 | Object obj = vm->chunk->constants[constant]; |
74 | array_push(vm->stack, obj); | 93 | array_push(vm->stack, obj); |
75 | } break; | 94 | } break; |
76 | case OP_SUM: { | 95 | case OP_SUM: { FIXNUM_BINARY_OP(+); } break; |
77 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); | 96 | case OP_SUB: { FIXNUM_BINARY_OP(-); } break; |
78 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); | 97 | case OP_MUL: { FIXNUM_BINARY_OP(*); } break; |
79 | array_push(vm->stack, FIXNUM_VAL(a + b)); | 98 | case OP_DIV: { FIXNUM_BINARY_OP(/); } break; |
80 | } break; | 99 | case OP_MOD: { FIXNUM_BINARY_OP(%); } break; |
81 | case OP_SUB: { | ||
82 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); | ||
83 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); | ||
84 | array_push(vm->stack, FIXNUM_VAL(b - a)); | ||
85 | } break; | ||
86 | case OP_MUL: { | ||
87 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); | ||
88 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); | ||
89 | array_push(vm->stack, FIXNUM_VAL(a * b)); | ||
90 | } break; | ||
91 | case OP_DIV: { | ||
92 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); | ||
93 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); | ||
94 | array_push(vm->stack, FIXNUM_VAL(b / a)); | ||
95 | } break; | ||
96 | case OP_MOD: { | ||
97 | ssize_t a = AS_FIXNUM(array_pop(vm->stack)); | ||
98 | ssize_t b = AS_FIXNUM(array_pop(vm->stack)); | ||
99 | array_push(vm->stack, FIXNUM_VAL(a % b)); | ||
100 | } break; | ||
101 | case OP_RETURN: { | 100 | case OP_RETURN: { |
102 | display(array_pop(vm->stack)); | 101 | display(array_pop(vm->stack)); |
103 | printf("\n"); | 102 | printf("\n"); |
@@ -107,8 +106,8 @@ vm_interpret(VM *vm, Chunk *chunk) { | |||
107 | error_push((Error){ | 106 | error_push((Error){ |
108 | .type = ERR_TYPE_RUNTIME, | 107 | .type = ERR_TYPE_RUNTIME, |
109 | .value = ERR_NOT_IMPLEMENTED, | 108 | .value = ERR_NOT_IMPLEMENTED, |
110 | .line = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].line, | 109 | .line = vm->chunk->lines[vm->pc - vm->chunk->code - 1].line, |
111 | .col = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].col, | 110 | .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, |
112 | }); | 111 | }); |
113 | return; | 112 | return; |
114 | } break; | 113 | } break; |
@@ -123,4 +122,6 @@ vm_interpret(VM *vm, Chunk *chunk) { | |||
123 | }); | 122 | }); |
124 | } | 123 | } |
125 | 124 | ||
125 | #undef FIXNUM_BINARY_OP | ||
126 | |||
126 | #endif // BDL_VM_H | 127 | #endif // BDL_VM_H |