xo-interpreter2 stack: refactor + bugfix operator expr
This commit is contained in:
parent
af0be72853
commit
f3f8505a65
6 changed files with 38 additions and 0 deletions
|
|
@ -58,9 +58,14 @@ namespace xo {
|
|||
* Return false if installation fails (e.g. memory exhausted)
|
||||
**/
|
||||
virtual bool install_type(Opaque d, const AGCObject & iface) = 0;
|
||||
|
||||
/** add gc root with address @p p_root **/
|
||||
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;
|
||||
|
||||
/** remove gc root with address @p p_root **/
|
||||
virtual void remove_gc_root_poly(Opaque d, obj<AGCObject> * p_root) = 0;
|
||||
|
||||
/** Request immediate collection.
|
||||
* 1. if collection is enabled, immediately collect all generations
|
||||
* up to (but not including) g
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ namespace xo {
|
|||
// non-const methods
|
||||
[[noreturn]] bool install_type(Opaque, const AGCObject &) noexcept override { _fatal(); }
|
||||
[[noreturn]] void add_gc_root_poly(Opaque, obj<AGCObject> *) override { _fatal(); }
|
||||
[[noreturn]] void remove_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(); }
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,9 @@ namespace xo {
|
|||
void add_gc_root_poly(Opaque d, obj<AGCObject> * p_root) override {
|
||||
I::add_gc_root_poly(_dcast(d), p_root);
|
||||
}
|
||||
void remove_gc_root_poly(Opaque d, obj<AGCObject> * p_root) override {
|
||||
I::remove_gc_root_poly(_dcast(d), p_root);
|
||||
}
|
||||
void request_gc(Opaque d, generation upto) override {
|
||||
I::request_gc(_dcast(d), upto);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,6 +22,9 @@ namespace xo {
|
|||
|
||||
RCollector() = default;
|
||||
RCollector(DataPtr data) : Object{std::move(data)} {}
|
||||
RCollector(const ACollector * iface, void * data)
|
||||
requires std::is_same_v<typename Object::DataType, xo::facet::DVariantPlaceholder>
|
||||
: Object(iface, data) {}
|
||||
|
||||
/** forward op in place. Defined in GCObject.hpp to avoid #include cycle **/
|
||||
template <typename DRepr>
|
||||
|
|
@ -33,6 +36,11 @@ namespace xo {
|
|||
template <typename DRepr>
|
||||
void forward_inplace(DRepr ** pp_repr);
|
||||
|
||||
/** convenience template where pointer requires pivot **/
|
||||
template <typename AFacet, typename DRepr>
|
||||
requires (!std::is_same_v<AFacet, AGCObject>)
|
||||
void forward_pivot_inplace(obj<AFacet,DRepr> * p_obj);
|
||||
|
||||
int32_t _typeseq() const noexcept { return O::iface()->_typeseq(); }
|
||||
size_type allocated(generation g, role r) const noexcept { return O::iface()->allocated(O::data(), g, r); }
|
||||
size_type reserved(generation g, role r) const noexcept { return O::iface()->reserved(O::data(), g, r); }
|
||||
|
|
@ -41,6 +49,7 @@ namespace xo {
|
|||
|
||||
bool install_type(const AGCObject & iface) { return O::iface()->install_type(O::data(), iface); }
|
||||
void add_gc_root_poly(obj<AGCObject> * p_root) { O::iface()->add_gc_root_poly(O::data(), p_root); }
|
||||
void remove_gc_root_poly(obj<AGCObject> * p_root) { O::iface()->remove_gc_root_poly(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); }
|
||||
|
||||
|
|
@ -50,6 +59,12 @@ namespace xo {
|
|||
O::iface()->add_gc_root_poly(O::data(), (obj<AGCObject> *)p_root);
|
||||
}
|
||||
|
||||
/** remove root @p p_root **/
|
||||
template <typename DRepr>
|
||||
void remove_gc_root(obj<AGCObject, DRepr> * p_root) {
|
||||
O::iface()->remove_gc_root_poly(O::data(), (obj<AGCObject> *)p_root);
|
||||
}
|
||||
|
||||
static bool _valid;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <xo/facet/FacetRegistry.hpp>
|
||||
|
||||
namespace xo {
|
||||
namespace mm {
|
||||
/** defined here to avoid #include cycle, since
|
||||
|
|
@ -34,6 +36,16 @@ namespace xo {
|
|||
|
||||
this->forward_inplace(&iface, (void **)p_repr);
|
||||
}
|
||||
|
||||
template <typename Object>
|
||||
template <typename AFacet, typename DRepr>
|
||||
requires (!std::is_same_v<AFacet, AGCObject>)
|
||||
void
|
||||
RCollector<Object>::forward_pivot_inplace(obj<AFacet, DRepr> * p_objs)
|
||||
{
|
||||
auto e = xo::facet::FacetRegistry::instance().variant<AGCObject,AFacet>(*p_objs);
|
||||
this->forward_inplace(e.iface(), (void **)&(p_objs->data_));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
/** @file CollectorTypeRegistry.cpp
|
||||
*
|
||||
* @author Roland Conybeare, Mar 2026
|
||||
**/
|
||||
|
||||
#include "CollectorTypeRegistry.hpp"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue