#include "Program.hpp" namespace jk { /*explicit*/ Program::Program() { } /*virtual*/ Program::~Program() { } Instr Program::get(size_t index) const { assert(index < size()); return m_instrs[index]; } void Program::push_instr(OpcodeType opcode, std::optional param /*= std::nullopt*/) { m_instrs.push_back(Instr { opcode, param }); } void Program::set_param(size_t index, param_t param) { assert(index < size()); m_instrs[index].param = param; } std::string Program::string() const { std::stringstream ss; size_t addr = 0; for (auto const& instr: m_instrs) { ss << addr << "\t" << std::string(OpcodeTypeStr[instr.opcode]) .substr(std::string("OPCODE_").size()); if (instr.param) { ss << "\t" << *instr.param; } ss << std::endl; addr++; } return ss.str(); } size_t Program::push_constant(std::shared_ptr value) { assert(value); m_constants.push_back(value); return m_constants.size() - 1; } std::shared_ptr Program::constant(size_t index) const { assert(index < m_constants.size()); return m_constants[index]; } }