Add ret function

This commit is contained in:
2020-05-16 12:10:17 +02:00
parent 5d71a1316c
commit f9c43f19e6
6 changed files with 31 additions and 2 deletions

View File

@@ -165,6 +165,11 @@ namespace Interpret
return std::make_unique<FunctionCallStatement>(std::get<std::string>(labelToken.data));
}
case Token::OperandType::ReturnFromFunction:
{
return std::make_unique<ReturnFromFunctionStatement>();
}
case Token::OperandType::LessThanInteger:
{
auto statement = std::make_unique<ControlFlowStatement>();
@@ -310,6 +315,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:
return 0;
}
}

View File

@@ -66,6 +66,17 @@ namespace Interpret
{
}
void ReturnFromFunctionStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
{
if (state.stackPointer < sizeof(unsigned))
{
throw Execute::StackUnderflow();
}
state.nextStatement = *(reinterpret_cast<unsigned const *>(state.memory.data() + (state.stackPointer - 1u)));
state.stackPointer -= sizeof(unsigned);
}
void SetStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
{
firstArgument.GetValue(state, registers) = secondArgument.GetValue(state, registers);

View File

@@ -15,6 +15,7 @@ namespace Token
{ "shli", OperandType::ShiftIntegerLeft },
{ "jmp", OperandType::Jump },
{ "call", OperandType::CallFunction },
{ "ret", OperandType::ReturnFromFunction },
{ "lti", OperandType::LessThanInteger },
{ "gti", OperandType::GreaterThanInteger },
{ "eqi", OperandType::EqualInteger },