xo-interpreter2 stack: refactor + bugfix operator expr

This commit is contained in:
Roland Conybeare 2026-03-12 20:26:08 -05:00
commit f3f8505a65
6 changed files with 38 additions and 0 deletions

View file

@ -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

View file

@ -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(); }

View file

@ -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);
}

View file

@ -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;
};

View file

@ -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_));
}
}
}