diff --git a/furvm/include/furvm/executor.hpp b/furvm/include/furvm/executor.hpp index 0699aba..e269511 100644 --- a/furvm/include/furvm/executor.hpp +++ b/furvm/include/furvm/executor.hpp @@ -150,6 +150,8 @@ public: thing<>& top_thing(); const thing<>& top_thing() const; + + const std::vector>& stack() const { return m_stack; } public: /** * @brief Stores a thing in a frame variable. @@ -191,8 +193,8 @@ private: executor_flags m_flags = executor_flags::Done; context* m_context; - std::stack m_frames; - std::stack> m_stack; + std::stack m_frames; + std::vector> m_stack; new_frame_callback m_newFrameCb = nullptr; }; diff --git a/furvm/src/executor.cpp b/furvm/src/executor.cpp index 025b621..bad5d1c 100644 --- a/furvm/src/executor.cpp +++ b/furvm/src/executor.cpp @@ -140,28 +140,28 @@ struct executor::frame executor::top_frame() const { } thing<>& executor::push_thing(thing<>&& thing) { - return m_stack.emplace(std::move(thing)); + return m_stack.emplace_back(std::move(thing)); } thing<>& executor::push_thing(const thing<>& thing) { - return m_stack.emplace(thing); + return m_stack.emplace_back(thing); } thing<> executor::pop_thing() { if (m_frames.top().stackBase >= m_stack.size()) throw stack_underflow(); - auto top = std::move(m_stack.top()); - m_stack.pop(); + auto top = std::move(m_stack.back()); + m_stack.pop_back(); return std::move(top); } thing<>& executor::top_thing() { if (m_frames.top().stackBase >= m_stack.size()) throw stack_underflow(); - return m_stack.top(); + return m_stack.back(); } const thing<>& executor::top_thing() const { if (m_frames.top().stackBase >= m_stack.size()) throw stack_underflow(); - return m_stack.top(); + return m_stack.back(); } void executor::store_thing(variable_t variable, const thing<>& thing) {