diff --git a/idl/GCObject.json5 b/idl/GCObject.json5 index 234b3d0..fc63bf5 100644 --- a/idl/GCObject.json5 +++ b/idl/GCObject.json5 @@ -62,10 +62,10 @@ // }, ], nonconst_methods: [ - // Opaque shallow_move(obj>) noexcept + // Opaque shallow_move(obj) noexcept { name: "shallow_move", - doc: ["move instance using allocator"], + doc: ["move instance using collector"], return_type: "Opaque", args:[ {type: "obj", name: "gc"}, diff --git a/idl/GCObjectVisitor.json5 b/idl/GCObjectVisitor.json5 index 2e8344d..9307219 100644 --- a/idl/GCObjectVisitor.json5 +++ b/idl/GCObjectVisitor.json5 @@ -57,6 +57,22 @@ // }, ], nonconst_methods: [ + // void alloc_copy(void * src) + { + name: "alloc_copy", + doc: [ + "allocate copy of source object at address @p src.", + "Source must be owned by this collector.", + "Increments object age" + ], + return_type: "void *", + args: [ + {type: "std::byte *", name: "src"}, + ], + const: false, + noexcept: false, + attributes: [], + }, // void visit_child(AGCObject * iface, void ** pp_data) noexcept; { name: "visit_child", diff --git a/include/xo/alloc2/gc/AGCObject.hpp b/include/xo/alloc2/gc/AGCObject.hpp index 3c0fed0..098d0c5 100644 --- a/include/xo/alloc2/gc/AGCObject.hpp +++ b/include/xo/alloc2/gc/AGCObject.hpp @@ -67,7 +67,7 @@ public: virtual void _drop(Opaque d) const noexcept = 0; // nonconst methods - /** move instance using allocator **/ + /** move instance using collector **/ virtual Opaque shallow_move(Opaque data, obj gc) const noexcept = 0; /** Invoke fn.visit_child(iface,data) for each child GCObject pointer. Context: provides address of data pointer so it can be updated in place diff --git a/include/xo/alloc2/gc/AGCObjectVisitor.hpp b/include/xo/alloc2/gc/AGCObjectVisitor.hpp index b533076..efedbfe 100644 --- a/include/xo/alloc2/gc/AGCObjectVisitor.hpp +++ b/include/xo/alloc2/gc/AGCObjectVisitor.hpp @@ -55,6 +55,10 @@ public: virtual void _drop(Opaque d) const noexcept = 0; // nonconst methods + /** allocate copy of source object at address @p src. +Source must be owned by this collector. +Increments object age **/ + virtual void * alloc_copy(Opaque data, std::byte * src) = 0; /** visit child of a gc-aware object. May update child in-place! **/ virtual void visit_child(Opaque data, AGCObject * iface, void ** pp_data) const noexcept = 0; ///@} diff --git a/include/xo/alloc2/gc/IGCObjectVisitor_Any.hpp b/include/xo/alloc2/gc/IGCObjectVisitor_Any.hpp index 287252c..7297239 100644 --- a/include/xo/alloc2/gc/IGCObjectVisitor_Any.hpp +++ b/include/xo/alloc2/gc/IGCObjectVisitor_Any.hpp @@ -60,6 +60,7 @@ namespace mm { // const methods // nonconst methods + [[noreturn]] void * alloc_copy(Opaque, std::byte *) override; [[noreturn]] void visit_child(Opaque, AGCObject *, void **) const noexcept override; ///@} diff --git a/include/xo/alloc2/gc/IGCObjectVisitor_Xfer.hpp b/include/xo/alloc2/gc/IGCObjectVisitor_Xfer.hpp index aa9b476..2786ed4 100644 --- a/include/xo/alloc2/gc/IGCObjectVisitor_Xfer.hpp +++ b/include/xo/alloc2/gc/IGCObjectVisitor_Xfer.hpp @@ -44,6 +44,9 @@ namespace mm { // const methods // non-const methods + void * alloc_copy(Opaque data, std::byte * src) override { + return I::alloc_copy(_dcast(data), src); + } void visit_child(Opaque data, AGCObject * iface, void ** pp_data) const noexcept override { return I::visit_child(_dcast(data), iface, pp_data); } diff --git a/include/xo/alloc2/gc/RGCObjectVisitor.hpp b/include/xo/alloc2/gc/RGCObjectVisitor.hpp index 7fbf907..b0f2f5b 100644 --- a/include/xo/alloc2/gc/RGCObjectVisitor.hpp +++ b/include/xo/alloc2/gc/RGCObjectVisitor.hpp @@ -74,6 +74,9 @@ public: // const methods // non-const methods (still const in router!) + void * alloc_copy(std::byte * src) { + return O::iface()->alloc_copy(O::data(), src); + } void visit_child(AGCObject * iface, void ** pp_data) noexcept { return O::iface()->visit_child(O::data(), iface, pp_data); } diff --git a/src/alloc2/facet/IGCObjectVisitor_Any.cpp b/src/alloc2/facet/IGCObjectVisitor_Any.cpp index 53d13ca..e60cc31 100644 --- a/src/alloc2/facet/IGCObjectVisitor_Any.cpp +++ b/src/alloc2/facet/IGCObjectVisitor_Any.cpp @@ -35,6 +35,12 @@ IGCObjectVisitor_Any::_valid // nonconst methods +auto +IGCObjectVisitor_Any::alloc_copy(Opaque, std::byte *) -> void * +{ + _fatal(); +} + auto IGCObjectVisitor_Any::visit_child(Opaque, AGCObject *, void **) const noexcept -> void {