From f8eaabfc556b76bfc44b4785d4fbac2df66bb34f Mon Sep 17 00:00:00 2001 From: Tijmen van Nesselrooij Date: Sat, 16 May 2020 12:17:10 +0200 Subject: [PATCH] Add exit operand --- bin/test.wasm | 6 ++---- include/execute/state.hpp | 1 + include/interpret/statement.hpp | 5 +++++ include/token/operandtype.hpp | 1 + src/execute/state.cpp | 3 ++- src/execute/virtualmachine.cpp | 2 +- src/interpret/operanddefinitions.cpp | 6 ++++++ src/interpret/statement.cpp | 5 +++++ src/token/operandtype.cpp | 1 + 9 files changed, 24 insertions(+), 6 deletions(-) diff --git a/bin/test.wasm b/bin/test.wasm index 515e672..5deeb94 100644 --- a/bin/test.wasm +++ b/bin/test.wasm @@ -91,9 +91,7 @@ int $3; # Jump over the interrupt call noop_function; int $3; -jmp the_real_exit; +exit; noop_function: -ret; - -the_real_exit: \ No newline at end of file +ret; \ No newline at end of file diff --git a/include/execute/state.hpp b/include/execute/state.hpp index 955bc0d..2a973b3 100644 --- a/include/execute/state.hpp +++ b/include/execute/state.hpp @@ -13,6 +13,7 @@ namespace Execute std::vector const interrupts; std::vector memory; unsigned stackPointer; + bool terminated; State(std::unordered_map const & labelStatementIndice, unsigned const memorySize); }; diff --git a/include/interpret/statement.hpp b/include/interpret/statement.hpp index 7e900c1..2760f83 100644 --- a/include/interpret/statement.hpp +++ b/include/interpret/statement.hpp @@ -71,6 +71,11 @@ namespace Interpret void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override; }; + struct ExitProgramStatement : Statement + { + void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override; + }; + struct SetStatement : Statement { Value firstArgument; diff --git a/include/token/operandtype.hpp b/include/token/operandtype.hpp index 56bc07b..e3a9f49 100644 --- a/include/token/operandtype.hpp +++ b/include/token/operandtype.hpp @@ -15,6 +15,7 @@ namespace Token Jump, CallFunction, ReturnFromFunction, + ExitProgram, LessThanInteger, GreaterThanInteger, EqualInteger, diff --git a/src/execute/state.cpp b/src/execute/state.cpp index 164a621..7d81d26 100644 --- a/src/execute/state.cpp +++ b/src/execute/state.cpp @@ -8,7 +8,8 @@ namespace Execute labelStatementIndice(_labelStatementIndice), interrupts(GetInterrupts()), memory(memorySize), - stackPointer(0u) + stackPointer(0u), + terminated(false) { } } \ No newline at end of file diff --git a/src/execute/virtualmachine.cpp b/src/execute/virtualmachine.cpp index b0a999d..f31d260 100644 --- a/src/execute/virtualmachine.cpp +++ b/src/execute/virtualmachine.cpp @@ -21,7 +21,7 @@ namespace Execute } state.currentStatement = state.nextStatement; - if (state.currentStatement >= code.statements.size()) + if (state.currentStatement >= code.statements.size() || state.terminated) { terminated = true; } diff --git a/src/interpret/operanddefinitions.cpp b/src/interpret/operanddefinitions.cpp index 4bbb64f..6bd1e22 100644 --- a/src/interpret/operanddefinitions.cpp +++ b/src/interpret/operanddefinitions.cpp @@ -170,6 +170,11 @@ namespace Interpret return std::make_unique(); } + case Token::OperandType::ExitProgram: + { + return std::make_unique(); + } + case Token::OperandType::LessThanInteger: { auto statement = std::make_unique(); @@ -316,6 +321,7 @@ namespace Interpret default: std::printf("WARNING: returning default argument length of 0 for operand type %i\n", static_cast(type)); case Token::OperandType::ReturnFromFunction: + case Token::OperandType::ExitProgram: return 0; } } diff --git a/src/interpret/statement.cpp b/src/interpret/statement.cpp index 82569d4..bd9b789 100644 --- a/src/interpret/statement.cpp +++ b/src/interpret/statement.cpp @@ -77,6 +77,11 @@ namespace Interpret state.stackPointer -= sizeof(unsigned); } + void ExitProgramStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) + { + state.terminated = true; + } + void SetStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) { firstArgument.GetValue(state, registers) = secondArgument.GetValue(state, registers); diff --git a/src/token/operandtype.cpp b/src/token/operandtype.cpp index c8b4789..9341bbb 100644 --- a/src/token/operandtype.cpp +++ b/src/token/operandtype.cpp @@ -16,6 +16,7 @@ namespace Token { "jmp", OperandType::Jump }, { "call", OperandType::CallFunction }, { "ret", OperandType::ReturnFromFunction }, + { "exit", OperandType::ExitProgram }, { "lti", OperandType::LessThanInteger }, { "gti", OperandType::GreaterThanInteger }, { "eqi", OperandType::EqualInteger },