diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-24 09:52:09 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-24 09:52:09 +0200 |
commit | b743e03fc6042e3e2d55cfa0387c092824de64c5 (patch) | |
tree | 1c74213017e20fc5bf675f571de2a264cf104cd3 /src/bytecode/vm.h | |
parent | f372586069ea0a92db65bc90cf844c1a35187430 (diff) | |
download | bdl-b743e03fc6042e3e2d55cfa0387c092824de64c5.tar.gz bdl-b743e03fc6042e3e2d55cfa0387c092824de64c5.zip |
Add print/display/newline ops
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index b3dd8c3..f1886ec 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h | |||
@@ -159,8 +159,37 @@ vm_interpret(VM *vm, Chunk *chunk) { | |||
159 | case OP_GREATER: { FIXNUM_COMPARE_OP(>); } break; | 159 | case OP_GREATER: { FIXNUM_COMPARE_OP(>); } break; |
160 | case OP_LESS_EQUAL: { FIXNUM_COMPARE_OP(<=); } break; | 160 | case OP_LESS_EQUAL: { FIXNUM_COMPARE_OP(<=); } break; |
161 | case OP_GREATER_EQUAL: { FIXNUM_COMPARE_OP(>=); } break; | 161 | case OP_GREATER_EQUAL: { FIXNUM_COMPARE_OP(>=); } break; |
162 | case OP_RETURN: { | 162 | case OP_DISPLAY: { |
163 | display(array_pop(vm->stack)); | 163 | display(array_pop(vm->stack)); |
164 | } break; | ||
165 | case OP_PRINT: { | ||
166 | Object obj = array_pop(vm->stack); | ||
167 | if (!IS_STRING(obj)) { | ||
168 | WRONG_ARG_ERR(); | ||
169 | } | ||
170 | StringView scanner = (StringView) { | ||
171 | .start = obj.text, | ||
172 | .n = array_size(obj.text), | ||
173 | }; | ||
174 | while (scanner.n != 0) { | ||
175 | char c = sv_next(&scanner); | ||
176 | if (c == '\\' && sv_peek(&scanner) == 'n') { | ||
177 | putchar('\n'); | ||
178 | sv_next(&scanner); | ||
179 | continue; | ||
180 | } | ||
181 | if (c == '\\' && sv_peek(&scanner) == '"') { | ||
182 | putchar('"'); | ||
183 | sv_next(&scanner); | ||
184 | continue; | ||
185 | } | ||
186 | putchar(c); | ||
187 | } | ||
188 | } break; | ||
189 | case OP_NEWLINE: { | ||
190 | printf("\n"); | ||
191 | } break; | ||
192 | case OP_RETURN: { | ||
164 | printf("\n"); | 193 | printf("\n"); |
165 | return; | 194 | return; |
166 | } break; | 195 | } break; |