roza/lib/VM.cpp

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