From 19fb6b2d97a970f94854cd17a58639b72d35c052 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 26 Oct 2021 10:00:49 +0200 Subject: Ensure the last statement is returned to stdout --- src/bytecode/compiler.h | 4 +++- src/bytecode/objects.h | 1 + src/bytecode/vm.h | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) (limited to 'src/bytecode') 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) { Token start_tok = peek_token(&compiler); while (has_next_token(&compiler) && peek_token(&compiler).type != TOKEN_EOF) { parse_tree(chunk, &compiler); - add_code(chunk, OP_DROP, start_tok.line, start_tok.column); + if (peek_token(&compiler).type != TOKEN_EOF) { + add_code(chunk, OP_DROP, start_tok.line, start_tok.column); + } } add_code(chunk, OP_RETURN, start_tok.line, start_tok.column); 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); #define AS_FIXNUM(VAL) ((VAL).fixnum) // Type checking. +#define IS_NIL(VAL) ((VAL).type == OBJ_TYPE_NIL) #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) #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) { } break; case OP_RETURN: { if (frame->rp == NULL) { + Object ret = array_pop(vm->stack); + if (!IS_NIL(ret)) { + object_display(ret); + printf("\n"); + } return; } vm->pc = frame->rp; -- cgit v1.2.1