diff options
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; |