/** @file DVsmApplyClosureFrame.hpp * * @author Roland Conybeare, Feb 2026 **/ #pragma once #include "VsmInstr.hpp" #include "DLocalEnv.hpp" #include namespace xo { namespace scm { /** Frame to preserve VSM registers: * (stack_, parent_, cont_) * while applying a closure. **/ class DVsmApplyClosureFrame { public: using ACollector = xo::mm::ACollector; using AGCObject = xo::mm::AGCObject; using AGCObjectVisitor = xo::mm::AGCObjectVisitor; using AAllocator = xo::mm::AAllocator; using ppindentinfo = xo::print::ppindentinfo; public: DVsmApplyClosureFrame(obj stack, VsmInstr cont, DLocalEnv * env); /** create instance, using memory from @p mm **/ static DVsmApplyClosureFrame * make(obj mm, obj parent, VsmInstr cont, DLocalEnv * env); obj parent() const { return stack_; } VsmInstr cont() const { return cont_; } DLocalEnv * local_env() const { return local_env_; } /** gcobject facet **/ std::size_t shallow_size() const noexcept; DVsmApplyClosureFrame * gco_shallow_move(obj gc) noexcept; void visit_gco_children(obj gc) noexcept; /** pretty-printing support **/ bool pretty(const ppindentinfo & ppii) const; protected: /** saved VSM stack_ register **/ obj stack_; /** saved VSM cont_ register **/ VsmInstr cont_; /** saved VSM local_env_ register **/ DLocalEnv * local_env_ = nullptr; }; } /*namespace scm*/ } /*namespace xo*/ /* end DVsmApplyClosureFrame.hpp */