xo-gc: + poly gc root method

This commit is contained in:
Roland Conybeare 2026-01-03 00:33:35 -05:00
commit 596589bb7b
8 changed files with 13 additions and 15 deletions

View file

@ -222,7 +222,7 @@ namespace xo {
bool install_type(const AGCObject & meta) noexcept;
/** add GC root at @p root_addr, with type @p typeseq **/
void add_gc_root(typeseq tseq, Opaque * root_addr) noexcept;
void add_gc_root_poly(obj<AGCObject> * p_root) noexcept;
/** Request immediate collection.
* 1. if collection is enabled, immediately collect all generations

View file

@ -57,7 +57,8 @@ namespace xo {
* Return false if installation fails (e.g. memory exhausted)
**/
virtual bool install_type(Opaque d, const AGCObject & iface) = 0;
virtual void add_gc_root(Opaque d, int32_t tseq, Opaque * root) = 0;
virtual void add_gc_root_poly(Opaque d, obj<AGCObject> * p_root) = 0;
//virtual void add_gc_root_typed(Opaque d, typeseq tseq, Opaque * root) = 0;
/** Request immediate collection.
* 1. if collection is enabled, immediately collect all generations

View file

@ -38,7 +38,7 @@ namespace xo {
// non-const methods
[[noreturn]] bool install_type(Opaque, const AGCObject &) noexcept override { _fatal(); }
[[noreturn]] void add_gc_root(Opaque, int32_t, Opaque *) override { _fatal(); }
[[noreturn]] void add_gc_root_poly(Opaque, obj<AGCObject> *) override { _fatal(); }
[[noreturn]] void request_gc(Opaque, generation) override { _fatal(); }
[[noreturn]] void forward_inplace(Opaque, AGCObject *, void **) override { _fatal(); }

View file

@ -44,7 +44,7 @@ namespace xo {
static bool is_type_installed(const DX1Collector & d, typeseq tseq);
static bool install_type(DX1Collector & d, const AGCObject & iface);
static void add_gc_root(DX1Collector & d, int32_t tseq, Opaque * root);
static void add_gc_root_poly(DX1Collector & d, obj<AGCObject> * p_root);
static void request_gc(DX1Collector & d, generation upto);
static void forward_inplace(DX1Collector & d, AGCObject * lhs_iface, void ** lhs_data);

View file

@ -50,8 +50,8 @@ namespace xo {
bool install_type(Opaque d, const AGCObject & iface) override {
return I::install_type(_dcast(d), iface);
}
void add_gc_root(Opaque d, int32_t tseq, Opaque * root) override {
I::add_gc_root(_dcast(d), tseq, root);
void add_gc_root_poly(Opaque d, obj<AGCObject> * p_root) override {
I::add_gc_root_poly(_dcast(d), p_root);
}
void request_gc(Opaque d, generation upto) override {
I::request_gc(_dcast(d), upto);

View file

@ -30,7 +30,7 @@ namespace xo {
bool is_type_installed(typeseq tseq) const noexcept { return O::iface()->is_type_installed(O::data(), tseq); }
bool install_type(const AGCObject & iface) { return O::iface()->install_type(O::data(), iface); }
void add_gc_root(int32_t tseq, Opaque * root) { O::iface()->add_gc_root(O::data(), tseq, root); }
void add_gc_root_poly(obj<AGCObject> * p_root) { O::iface()->add_gc_root(O::data(), p_root); }
void request_gc(generation g) { O::iface()->request_gc(O::data(), g); }
void forward_inplace(AGCObject * lhs_iface, void ** lhs_data) { O::iface()->forward_inplace(O::data(), lhs_iface, lhs_data); }

View file

@ -229,11 +229,9 @@ namespace xo {
}
void
DX1Collector::add_gc_root(typeseq tseq,
Opaque * root) noexcept
DX1Collector::add_gc_root_poly(obj<AGCObject> * p_root) noexcept
{
(void)tseq;
(void)root;
(void)p_root;
}
void

View file

@ -61,11 +61,10 @@ namespace xo {
}
void
ICollector_DX1Collector::add_gc_root(DX1Collector & d,
int32_t tseq,
Opaque * root)
ICollector_DX1Collector::add_gc_root_poly(DX1Collector & d,
obj<AGCObject> * p_root)
{
d.add_gc_root(typeseq(tseq), root);
d.add_gc_root_poly(p_root);
}
void