55 lines
990 B
C++
55 lines
990 B
C++
|
#include "VM.hpp"
|
||
|
|
||
|
namespace roza
|
||
|
{
|
||
|
/*explicit*/ VM::VM(StatusLog& log)
|
||
|
: m_log { log }
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/*virtual*/ VM::~VM()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void VM::exec(std::shared_ptr<Program> program)
|
||
|
{
|
||
|
while (m_pc < program->size())
|
||
|
{
|
||
|
switch (program->opcode(m_pc))
|
||
|
{
|
||
|
case OP_PUSH_CONST: {
|
||
|
param_t param = *program->param(m_pc);
|
||
|
push(param);
|
||
|
m_pc++;
|
||
|
} break;
|
||
|
|
||
|
case OP_POP: {
|
||
|
pop();
|
||
|
m_pc++;
|
||
|
} break;
|
||
|
|
||
|
default:
|
||
|
m_log.fatal(SrcLoc {},
|
||
|
std::string()
|
||
|
+ "cannot execute opcode '"
|
||
|
+ OpcodeStr[program->opcode(m_pc)]
|
||
|
+ "'"); break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void VM::push(param_t param)
|
||
|
{
|
||
|
m_stack.push_back(param);
|
||
|
}
|
||
|
|
||
|
param_t VM::pop()
|
||
|
{
|
||
|
assert(m_stack.size() > 0);
|
||
|
|
||
|
param_t res = m_stack.back();
|
||
|
m_stack.pop_back();
|
||
|
return res;
|
||
|
}
|
||
|
}
|