#include "VM.hpp" namespace roza { /*explicit*/ VM::VM(StatusLog& log) : m_log { log } { } /*virtual*/ VM::~VM() { } void VM::exec(std::shared_ptr 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; } }