From 24912ffd389a2b6ae5fdb625e8e9dc3778f5630d Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 4 Feb 2026 16:22:39 -0500 Subject: [PATCH] xo-facet: + builtin _drop() method for poly dtor call --- xo-facet/CMakeLists.txt | 1 + xo-facet/codegen/abstract_facet.hpp.j2 | 2 ++ xo-facet/codegen/iface_facet_any.hpp.j2 | 5 ++++- xo-facet/codegen/iface_facet_xfer.hpp.j2 | 5 ++++- xo-facet/codegen/router_facet.hpp.j2 | 5 ++++- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/xo-facet/CMakeLists.txt b/xo-facet/CMakeLists.txt index ad8a4cb4..d8ad41a4 100644 --- a/xo-facet/CMakeLists.txt +++ b/xo-facet/CMakeLists.txt @@ -27,6 +27,7 @@ set(SELF_LIB xo_facet) xo_add_headeronly_library(${SELF_LIB}) # note: dependencies here must coordinate with cmake/xo_facetConfig.cmake.in +xo_headeronly_dependency(${SELF_LIB} xo_arena) xo_headeronly_dependency(${SELF_LIB} xo_reflectutil) xo_install_library4(${SELF_LIB} ${PROJECT_NAME}Targets) diff --git a/xo-facet/codegen/abstract_facet.hpp.j2 b/xo-facet/codegen/abstract_facet.hpp.j2 index 76985b6a..b125bce4 100644 --- a/xo-facet/codegen/abstract_facet.hpp.j2 +++ b/xo-facet/codegen/abstract_facet.hpp.j2 @@ -60,6 +60,8 @@ public: // const methods /** RTTI: unique id# for actual runtime data representation **/ virtual typeseq _typeseq() const noexcept = 0; + /** destroy instance @p d; calls c++ dtor only for actual runtime type; does not recover memory **/ + virtual void _drop(Opaque d) const noexcept = 0; {% for md in const_methods %} /** {{md.doc}} **/ virtual {{md.return_type}} {{md.name}}({{md.args | args}}) {{md | qualifiers}} = 0; diff --git a/xo-facet/codegen/iface_facet_any.hpp.j2 b/xo-facet/codegen/iface_facet_any.hpp.j2 index 87e9d74a..361bb2ef 100644 --- a/xo-facet/codegen/iface_facet_any.hpp.j2 +++ b/xo-facet/codegen/iface_facet_any.hpp.j2 @@ -62,8 +62,11 @@ namespace {{facet_ns2}} { // from {{abstract_facet}} - // const methods + // builtin methods typeseq _typeseq() const noexcept override { return s_typeseq; } + [[noreturn]] void _drop(Opaque) const noexcept override { _fatal(); } + + // const methods {% for md in const_methods %} [[noreturn]] {{md.return_type}} {{md.name}}({{md.args | argtypes}}) {{md | qualifiers}} override { _fatal(); } {% endfor %} diff --git a/xo-facet/codegen/iface_facet_xfer.hpp.j2 b/xo-facet/codegen/iface_facet_xfer.hpp.j2 index c0f02814..80bd79c1 100644 --- a/xo-facet/codegen/iface_facet_xfer.hpp.j2 +++ b/xo-facet/codegen/iface_facet_xfer.hpp.j2 @@ -49,8 +49,11 @@ namespace {{facet_ns2}} { // from {{abstract_facet}} - // const methods + // builtin methods typeseq _typeseq() const noexcept override { return s_typeseq; } + void _drop(Opaque d) const noexcept override { _dcast(d).~DRepr(); } + + // const methods {% for md in const_methods %} {{md.return_type}} {{md.name}}({{md.args | args}}) {{md | qualifiers}} override { return I::{{md.name}}({{md.args | argnames}}); diff --git a/xo-facet/codegen/router_facet.hpp.j2 b/xo-facet/codegen/router_facet.hpp.j2 index b8d70733..5c3f6497 100644 --- a/xo-facet/codegen/router_facet.hpp.j2 +++ b/xo-facet/codegen/router_facet.hpp.j2 @@ -56,8 +56,11 @@ public: ///@{ {% endif %} - // const methods + // builtin methods typeseq _typeseq() const noexcept { return O::iface()->_typeseq(); } + void _drop() const noexcept { O::iface()->_drop(O::data()); } + + // const methods {% for md in const_methods %} {{md.return_type}} {{md.name}}({{md.args | argsnodata}}) {{md | qualifiers}} { return O::iface()->{{md.name}}({{md.args | argrouting}});