Add exit operand
This commit is contained in:
@@ -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:
|
||||
ret;
|
||||
@@ -13,6 +13,7 @@ namespace Execute
|
||||
std::vector<InterruptFn> const interrupts;
|
||||
std::vector<std::uint8_t> memory;
|
||||
unsigned stackPointer;
|
||||
bool terminated;
|
||||
|
||||
State(std::unordered_map<std::string, unsigned> const & labelStatementIndice, unsigned const memorySize);
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace Token
|
||||
Jump,
|
||||
CallFunction,
|
||||
ReturnFromFunction,
|
||||
ExitProgram,
|
||||
LessThanInteger,
|
||||
GreaterThanInteger,
|
||||
EqualInteger,
|
||||
|
||||
@@ -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