diff --git a/furvm/include/furvm/executor.hpp b/furvm/include/furvm/executor.hpp index 45add42..ab0353b 100644 --- a/furvm/include/furvm/executor.hpp +++ b/furvm/include/furvm/executor.hpp @@ -83,6 +83,14 @@ public: * @return The flags. */ executor_flags flags() const { return m_flags; } + + bool done() const { return (m_flags & executor_flags::Done) == executor_flags::Done; } + + bool suspended() const { return (m_flags & executor_flags::Suspended) == executor_flags::Suspended; } + + void unsuspend() { m_flags = m_flags & ~executor_flags::Suspended; } + + void clear_flags() { m_flags = m_frames.empty() ? executor_flags::Done : furvm::executor_flags{ 0 }; } public: /** * @brief Pushes a new frame. @@ -173,7 +181,7 @@ private: private: static bool compare_thing_types(const thing_type& lhs, const thing_type& rhs); private: - executor_flags m_flags{}; // NOLINT(bugprone-invalid-enum-default-initialization) + executor_flags m_flags = executor_flags::Done; context* m_context; std::stack m_frames; diff --git a/furvm/src/executor.cpp b/furvm/src/executor.cpp index 1a4a6a5..528f071 100644 --- a/furvm/src/executor.cpp +++ b/furvm/src/executor.cpp @@ -104,6 +104,12 @@ void executor::push_frame(const mod_h& mod, function function) { default: throw std::runtime_error("unexpected function type"); } if (m_newFrameCb) m_newFrameCb(*this); + + if (!m_frames.empty()) { + m_flags = m_flags & ~executor_flags::Done; + } else { + m_flags = m_flags | executor_flags::Done; + } } struct executor::frame executor::pop_frame() { @@ -117,6 +123,13 @@ struct executor::frame executor::pop_frame() { } if (m_stack.size() != frame.stackBase) throw std::runtime_error("unexhausted stack"); if (returnValue.has_value()) push_thing(std::move(returnValue.value())); + + if (!m_frames.empty()) { + m_flags = m_flags & ~executor_flags::Done; + } else { + m_flags = m_flags | executor_flags::Done; + } + return frame; }