#ifndef jk_VM_HPP #define jk_VM_HPP #include "commons.hpp" #include "Program.hpp" namespace jk { struct Frame { std::shared_ptr program; std::unordered_map> locals; size_t ret_addr; size_t stack_sz; }; class VM { public: explicit VM(); virtual ~VM(); void execute(std::shared_ptr program); void execute(); std::string string() const; size_t push_heap(std::shared_ptr value); std::shared_ptr heap(size_t addr); void set_global(size_t addr, std::shared_ptr value); private: size_t m_pc = 0; std::vector m_frames; std::vector m_stack; std::vector> m_heap; std::unordered_map> m_globals; void push(param_t param); param_t pop(); std::shared_ptr program() const; }; } #endif