aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-24 09:52:09 +0200
committerBad Diode <bd@badd10de.dev>2021-10-24 09:52:09 +0200
commitb743e03fc6042e3e2d55cfa0387c092824de64c5 (patch)
tree1c74213017e20fc5bf675f571de2a264cf104cd3 /src/bytecode/vm.h
parentf372586069ea0a92db65bc90cf844c1a35187430 (diff)
downloadbdl-b743e03fc6042e3e2d55cfa0387c092824de64c5.tar.gz
bdl-b743e03fc6042e3e2d55cfa0387c092824de64c5.zip
Add print/display/newline ops
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;