From a27b49d93dd20925dd176fc0222ff18db4919c2f Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 17 Feb 2026 14:42:17 -0500 Subject: [PATCH] xo-interpreter2 stack: define-expr's work at top-level --- include/xo/gc/PolyForwarderUtil.hpp | 66 +++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 include/xo/gc/PolyForwarderUtil.hpp diff --git a/include/xo/gc/PolyForwarderUtil.hpp b/include/xo/gc/PolyForwarderUtil.hpp new file mode 100644 index 0000000..19f99c9 --- /dev/null +++ b/include/xo/gc/PolyForwarderUtil.hpp @@ -0,0 +1,66 @@ +/** @file PolyForwarderUtil.hpp + * + * @author Roland Conybeare, Feb 2026 + **/ + +#pragma once + +#include "Collector.hpp" +#include + +namespace xo { + namespace mm { + + /** Utility class for forwarding support on + * faceted object pointers that have some primary + * facet _other_ than AGCObject. + * + * For fop with AGCObject facet, with collector gc: + * + * obj gc = ..; + * obj ptr = ..; + * + * gc.forward_inplace(&ptr); + * + * for fop with some other facet: + * + * obj ptr = ..; + * PolyForwarderUtil::forward_inplace(gc, &ptr); + * + * or + * poly_forward_inplace(gc, &ptr); + **/ + class PolyForwarderUtil { + public: + template + static void forward_inplace(obj gc, obj * p_ptr) { + using xo::facet::FacetRegistry; + + /** + * p_ptr + * v FacetRegistry + * +--------+---------+ .variant() +-----------+---------+ + * | AFacet | DRepr x | -----------------> | AGCobject | DRepr x | + * +--------+-------|-+ +-----------+-------|-+ + * | | + * | /-------------------------------------------/ + * | | + * v v + * +-------+ + * | DRepr | + * +-------+ + **/ + + auto gco = FacetRegistry::instance().variant(*p_ptr); + gc.forward_inplace(gco.iface(), (void **)&(p_ptr->data_)); + } + }; + + template + void poly_forward_inplace(obj gc, obj * p_ptr) { + PolyForwarderUtil::forward_inplace(gc, p_ptr); + } + } /*namespace mm*/ +} /*namespace xo*/ + +/* end PolyForwarderUtil.hpp */