#ifndef fk_VM_HPP #define fk_VM_HPP #include "commons.hpp" #include "Program.hpp" #include "NativeFunction.hpp" namespace fk { using global_t = std::variant>; struct Frame { std::shared_ptr program; std::unordered_map> locals; }; class VM { public: explicit VM(); virtual ~VM(); Frame& frame() { return m_frames.back(); } void mount(std::shared_ptr program); void run(); global_t load_global(addr_t addr) const; void store_global(addr_t addr, global_t value); size_t store_global(global_t value); std::shared_ptr load_local(addr_t addr); void store_local(addr_t addr, std::shared_ptr constant); std::string string() const; private: addr_t m_pc = 0; std::vector m_frames; std::vector m_stack; std::unordered_map m_globals; void push(addr_t addr); addr_t top(); addr_t pop(); }; } #endif