aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-26 10:00:49 +0200
committerBad Diode <bd@badd10de.dev>2021-10-26 10:03:06 +0200
commit19fb6b2d97a970f94854cd17a58639b72d35c052 (patch)
tree273c6a36daf0989b715c3b53ea75419d1131270e
parentda84e7e731de39ff385ae675a023ddcb9c58d06a (diff)
downloadbdl-19fb6b2d97a970f94854cd17a58639b72d35c052.tar.gz
bdl-19fb6b2d97a970f94854cd17a58639b72d35c052.zip
Ensure the last statement is returned to stdout
-rwxr-xr-xsrc/bytecode/compiler.h4
-rwxr-xr-xsrc/bytecode/objects.h1
-rwxr-xr-xsrc/bytecode/vm.h5
3 files changed, 9 insertions, 1 deletions
diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h
index ca187b3..e20b4f1 100755
--- a/src/bytecode/compiler.h
+++ b/src/bytecode/compiler.h
@@ -503,7 +503,9 @@ compile(Token *tokens) {
503 Token start_tok = peek_token(&compiler); 503 Token start_tok = peek_token(&compiler);
504 while (has_next_token(&compiler) && peek_token(&compiler).type != TOKEN_EOF) { 504 while (has_next_token(&compiler) && peek_token(&compiler).type != TOKEN_EOF) {
505 parse_tree(chunk, &compiler); 505 parse_tree(chunk, &compiler);
506 add_code(chunk, OP_DROP, start_tok.line, start_tok.column); 506 if (peek_token(&compiler).type != TOKEN_EOF) {
507 add_code(chunk, OP_DROP, start_tok.line, start_tok.column);
508 }
507 } 509 }
508 add_code(chunk, OP_RETURN, start_tok.line, start_tok.column); 510 add_code(chunk, OP_RETURN, start_tok.line, start_tok.column);
509 return chunk; 511 return chunk;
diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h
index e0c72b0..6c286b5 100755
--- a/src/bytecode/objects.h
+++ b/src/bytecode/objects.h
@@ -63,6 +63,7 @@ Object object_copy(Object src);
63#define AS_FIXNUM(VAL) ((VAL).fixnum) 63#define AS_FIXNUM(VAL) ((VAL).fixnum)
64 64
65// Type checking. 65// Type checking.
66#define IS_NIL(VAL) ((VAL).type == OBJ_TYPE_NIL)
66#define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) 67#define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE)
67#define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) 68#define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE)
68#define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) 69#define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM)
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h
index d654e2c..0ce6dec 100755
--- a/src/bytecode/vm.h
+++ b/src/bytecode/vm.h
@@ -263,6 +263,11 @@ vm_interpret(VM *vm) {
263 } break; 263 } break;
264 case OP_RETURN: { 264 case OP_RETURN: {
265 if (frame->rp == NULL) { 265 if (frame->rp == NULL) {
266 Object ret = array_pop(vm->stack);
267 if (!IS_NIL(ret)) {
268 object_display(ret);
269 printf("\n");
270 }
266 return; 271 return;
267 } 272 }
268 vm->pc = frame->rp; 273 vm->pc = frame->rp;