From 1a8d5fcabeccc5cb265c4f5a6fd3a5fac602a226 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Mon, 29 Dec 2025 14:32:52 -0500 Subject: [PATCH] xo-gc xo-object2 xo-facet: builds w/ ISequence,Dlist --- include/xo/gc/detail/ACollector.hpp | 9 ++++++--- include/xo/gc/detail/AGCObject.hpp | 9 ++++++--- include/xo/gc/detail/ICollector_Any.hpp | 2 +- include/xo/gc/detail/ICollector_DX1Collector.hpp | 2 +- include/xo/gc/detail/ICollector_Xfer.hpp | 4 ++-- include/xo/gc/detail/IGCObject_Any.hpp | 8 +++++--- include/xo/gc/detail/IGCObject_Xfer.hpp | 12 +++++++----- include/xo/gc/detail/RCollector.hpp | 2 +- include/xo/gc/detail/RGCObject.hpp | 2 +- src/gc/ICollector_DX1Collector.cpp | 8 +++++--- 10 files changed, 35 insertions(+), 23 deletions(-) diff --git a/include/xo/gc/detail/ACollector.hpp b/include/xo/gc/detail/ACollector.hpp index 24bd219..5a41f91 100644 --- a/include/xo/gc/detail/ACollector.hpp +++ b/include/xo/gc/detail/ACollector.hpp @@ -5,7 +5,7 @@ #pragma once -#include "IGCObject_Any.hpp" +//#include "IGCObject_Any.hpp" #include #include @@ -22,6 +22,7 @@ namespace xo { using Copaque = const void *; using Opaque = void *; + struct AGCObject; struct IGCObject_Any; // see IGCObject_Any.hpp /** @class ACollector @@ -53,10 +54,12 @@ namespace xo { virtual void install_type(Opaque d, int32_t tseq, IGCObject_Any & iface) = 0; virtual void add_gc_root(Opaque d, int32_t tseq, Opaque * root) = 0; - /** evacuate @p *lhs to to-space and replace with forwarding pointer + /** evacuate @p *lhs, that refers to state with interface @p lhs_iface, + * to collector @p d's to-space. Replace *lhs_data with forwarding pointer + * * Require: gc in progress **/ - virtual void forward_inplace(Opaque d, obj * lhs) = 0; + virtual void forward_inplace(Opaque d, AGCObject * lhs_iface, void ** lhs_data) = 0; }; } diff --git a/include/xo/gc/detail/AGCObject.hpp b/include/xo/gc/detail/AGCObject.hpp index 1e0a6d4..ae2b8a0 100644 --- a/include/xo/gc/detail/AGCObject.hpp +++ b/include/xo/gc/detail/AGCObject.hpp @@ -17,6 +17,8 @@ namespace xo { using Copaque = const void *; using Opaque = void *; + struct ACollector; + /** @class AObject * @brief Abstract facet for collector-eligible data * @@ -30,9 +32,10 @@ namespace xo { virtual int32_t _typeseq() const noexcept = 0; virtual size_type shallow_size(Copaque d) const noexcept = 0; - virtual Opaque * shallow_copy(Copaque d, - obj mm) const noexcept = 0; - virtual size_type forward_children(Opaque d) const noexcept = 0; + virtual Opaque shallow_copy(Copaque d, + obj mm) const noexcept = 0; + virtual size_type forward_children(Opaque d, + obj) const noexcept = 0; }; // implementation IGCObject_DRepr of AGCObject for state DRepr diff --git a/include/xo/gc/detail/ICollector_Any.hpp b/include/xo/gc/detail/ICollector_Any.hpp index c977968..b4836f6 100644 --- a/include/xo/gc/detail/ICollector_Any.hpp +++ b/include/xo/gc/detail/ICollector_Any.hpp @@ -36,7 +36,7 @@ namespace xo { // non-const methods [[noreturn]] void install_type(Opaque, int32_t, IGCObject_Any &) noexcept override { _fatal(); } [[noreturn]] void add_gc_root(Opaque, int32_t, Opaque *) override { _fatal(); } - [[noreturn]] void forward_inplace(Opaque, obj *) override { _fatal(); } + [[noreturn]] void forward_inplace(Opaque, AGCObject *, void **) override { _fatal(); } private: [[noreturn]] static void _fatal(); diff --git a/include/xo/gc/detail/ICollector_DX1Collector.hpp b/include/xo/gc/detail/ICollector_DX1Collector.hpp index 9bc6e12..c531ae1 100644 --- a/include/xo/gc/detail/ICollector_DX1Collector.hpp +++ b/include/xo/gc/detail/ICollector_DX1Collector.hpp @@ -44,7 +44,7 @@ namespace xo { static void install_type(DX1Collector & d, int32_t seq, IGCObject_Any & iface); static void add_gc_root(DX1Collector & d, int32_t tseq, Opaque * root); - static void forward_inplace(DX1Collector & d, obj * lhs); + static void forward_inplace(DX1Collector & d, AGCObject * lhs_iface, void ** lhs_data); static int32_t s_typeseq; static bool _valid; diff --git a/include/xo/gc/detail/ICollector_Xfer.hpp b/include/xo/gc/detail/ICollector_Xfer.hpp index 2177b63..c44bd3c 100644 --- a/include/xo/gc/detail/ICollector_Xfer.hpp +++ b/include/xo/gc/detail/ICollector_Xfer.hpp @@ -49,8 +49,8 @@ namespace xo { void add_gc_root(Opaque d, int32_t tseq, Opaque * root) override { I::add_gc_root(_dcast(d), tseq, root); } - void forward_inplace(Opaque d, obj * lhs) override { - I::forward_inplace(_dcast(d), lhs); + void forward_inplace(Opaque d, AGCObject * lhs_iface, void ** lhs_data) override { + I::forward_inplace(_dcast(d), lhs_iface, lhs_data); } private: diff --git a/include/xo/gc/detail/IGCObject_Any.hpp b/include/xo/gc/detail/IGCObject_Any.hpp index 039a125..b387b9b 100644 --- a/include/xo/gc/detail/IGCObject_Any.hpp +++ b/include/xo/gc/detail/IGCObject_Any.hpp @@ -6,6 +6,7 @@ #pragma once #include "AGCObject.hpp" +#include "Collector.hpp" #include namespace xo { @@ -31,9 +32,10 @@ namespace xo { int32_t _typeseq() const noexcept override { return s_typeseq; } [[noreturn]] size_type shallow_size(Copaque) const noexcept override { _fatal(); } - [[noreturn]] Opaque * shallow_copy(Copaque, - obj) const noexcept override { _fatal(); } - [[noreturn]] size_type forward_children(Opaque) const noexcept override { _fatal(); } + [[noreturn]] Opaque shallow_copy(Copaque, + obj) const noexcept override { _fatal(); } + [[noreturn]] size_type forward_children(Opaque, + obj) const noexcept override { _fatal(); } private: [[noreturn]] static void _fatal(); diff --git a/include/xo/gc/detail/IGCObject_Xfer.hpp b/include/xo/gc/detail/IGCObject_Xfer.hpp index 75f78fd..95e20ff 100644 --- a/include/xo/gc/detail/IGCObject_Xfer.hpp +++ b/include/xo/gc/detail/IGCObject_Xfer.hpp @@ -6,6 +6,7 @@ #pragma once #include "AGCObject.hpp" +#include "ACollector.hpp" namespace xo { namespace mm { @@ -28,16 +29,17 @@ namespace xo { int32_t _typeseq() const noexcept override { return s_typeseq; } size_type shallow_size(Copaque d) const noexcept override { - return I::shallow_copy(_dcast(d)); + return I::shallow_size(_dcast(d)); } - Opaque * shallow_copy(Copaque d, obj mm) const noexcept override { - return I::shallow_size(_dcast(d), mm); + Opaque shallow_copy(Copaque d, obj mm) const noexcept override { + return I::shallow_copy(_dcast(d), mm); } // non-const methods - size_type forward_children(Opaque d) const noexcept override { - return I::forward_children(d); + size_type forward_children(Opaque d, + obj gc) const noexcept override { + return I::forward_children(_dcast(d), gc); } private: diff --git a/include/xo/gc/detail/RCollector.hpp b/include/xo/gc/detail/RCollector.hpp index 753af3c..47e9c43 100644 --- a/include/xo/gc/detail/RCollector.hpp +++ b/include/xo/gc/detail/RCollector.hpp @@ -30,7 +30,7 @@ namespace xo { void install_type(int32_t tseq, IGCObject_Any & iface) { return O::iface()->install_type(O::data(), tseq, iface); } void add_gc_root(int32_t tseq, Opaque * root) { O::iface()->add_gc_root(O::data(), tseq, root); } - void forward_inplace(obj * lhs) { O::iface()->forward_inplace(O::data(), lhs); } + void forward_inplace(AGCObject * lhs_iface, void ** lhs_data) { O::iface()->forward_inplace(O::data(), lhs_iface, lhs_data); } static bool _valid; }; diff --git a/include/xo/gc/detail/RGCObject.hpp b/include/xo/gc/detail/RGCObject.hpp index 054b995..29bebf1 100644 --- a/include/xo/gc/detail/RGCObject.hpp +++ b/include/xo/gc/detail/RGCObject.hpp @@ -25,7 +25,7 @@ namespace xo { int32_t _typeseq() const noexcept { return O::iface()->_typeseq(); } size_type shallow_size() const noexcept { O::iface()->shallow_size(O::data()); } - Opaque * shallow_copy(obj mm) const noexcept { O::iface()->shallow_copy(O::data(), mm); } + Opaque shallow_copy(obj mm) const noexcept { O::iface()->shallow_copy(O::data(), mm); } size_type forward_children() noexcept { O::iface()->forward_children(O::data()); } static bool _valid; diff --git a/src/gc/ICollector_DX1Collector.cpp b/src/gc/ICollector_DX1Collector.cpp index 41e05f9..b4d8f24 100644 --- a/src/gc/ICollector_DX1Collector.cpp +++ b/src/gc/ICollector_DX1Collector.cpp @@ -73,8 +73,10 @@ namespace xo { void ICollector_DX1Collector::forward_inplace(DX1Collector & d, - obj * lhs) + AGCObject * lhs_iface, + void ** lhs_data) { + (void)lhs_iface; assert(d.runstate_.is_running()); /* @@ -90,7 +92,7 @@ namespace xo { * +----------+ */ - void * object_data = (byte *)(*lhs).opaque_data(); + void * object_data = (byte *)lhs_data; if (!d.contains(role::from_space(), object_data)) { /* *lhs isn't in GC-allocated space. @@ -143,7 +145,7 @@ namespace xo { void * dest = *(void**)object_data; /* update *lhs in-place */ - (*lhs).reset_opaque(dest); + *lhs_data = dest; } else if (check_move_policy(d, alloc_hdr, object_data)) { /* copy object *lhs + replace with forwarding pointer */