Add exit operand

This commit is contained in:
2020-05-16 12:17:10 +02:00
parent 1ce75c3772
commit f8eaabfc55
9 changed files with 24 additions and 6 deletions

View File

@@ -8,7 +8,8 @@ namespace Execute
labelStatementIndice(_labelStatementIndice),
interrupts(GetInterrupts()),
memory(memorySize),
stackPointer(0u)
stackPointer(0u),
terminated(false)
{
}
}

View File

@@ -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;
}

View File

@@ -170,6 +170,11 @@ namespace Interpret
return std::make_unique<ReturnFromFunctionStatement>();
}
case Token::OperandType::ExitProgram:
{
return std::make_unique<ExitProgramStatement>();
}
case Token::OperandType::LessThanInteger:
{
auto statement = std::make_unique<ControlFlowStatement>();
@@ -316,6 +321,7 @@ namespace Interpret
default:
std::printf("WARNING: returning default argument length of 0 for operand type %i\n", static_cast<int>(type));
case Token::OperandType::ReturnFromFunction:
case Token::OperandType::ExitProgram:
return 0;
}
}

View File

@@ -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);

View File

@@ -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 },