Add exit operand
This commit is contained in:
@@ -8,7 +8,8 @@ namespace Execute
|
||||
labelStatementIndice(_labelStatementIndice),
|
||||
interrupts(GetInterrupts()),
|
||||
memory(memorySize),
|
||||
stackPointer(0u)
|
||||
stackPointer(0u),
|
||||
terminated(false)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 },
|
||||
|
||||
Reference in New Issue
Block a user