aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-xsrc/bytecode/vm.h31
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;