refactor: make shallow_move() available from AGCObjectVisitor
This commit is contained in:
parent
90ab86f69c
commit
db4ccfd911
8 changed files with 36 additions and 3 deletions
|
|
@ -62,10 +62,10 @@
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
nonconst_methods: [
|
nonconst_methods: [
|
||||||
// Opaque shallow_move(obj<AAllocator>>) noexcept
|
// Opaque shallow_move(obj<ACollector>) noexcept
|
||||||
{
|
{
|
||||||
name: "shallow_move",
|
name: "shallow_move",
|
||||||
doc: ["move instance using allocator"],
|
doc: ["move instance using collector"],
|
||||||
return_type: "Opaque",
|
return_type: "Opaque",
|
||||||
args:[
|
args:[
|
||||||
{type: "obj<ACollector>", name: "gc"},
|
{type: "obj<ACollector>", name: "gc"},
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,22 @@
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
nonconst_methods: [
|
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;
|
// void visit_child(AGCObject * iface, void ** pp_data) noexcept;
|
||||||
{
|
{
|
||||||
name: "visit_child",
|
name: "visit_child",
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ public:
|
||||||
virtual void _drop(Opaque d) const noexcept = 0;
|
virtual void _drop(Opaque d) const noexcept = 0;
|
||||||
|
|
||||||
// nonconst methods
|
// nonconst methods
|
||||||
/** move instance using allocator **/
|
/** move instance using collector **/
|
||||||
virtual Opaque shallow_move(Opaque data, obj<ACollector> gc) const noexcept = 0;
|
virtual Opaque shallow_move(Opaque data, obj<ACollector> gc) const noexcept = 0;
|
||||||
/** Invoke fn.visit_child(iface,data) for each child GCObject pointer.
|
/** Invoke fn.visit_child(iface,data) for each child GCObject pointer.
|
||||||
Context: provides address of data pointer so it can be updated in place
|
Context: provides address of data pointer so it can be updated in place
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,10 @@ public:
|
||||||
virtual void _drop(Opaque d) const noexcept = 0;
|
virtual void _drop(Opaque d) const noexcept = 0;
|
||||||
|
|
||||||
// nonconst methods
|
// 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! **/
|
/** 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;
|
virtual void visit_child(Opaque data, AGCObject * iface, void ** pp_data) const noexcept = 0;
|
||||||
///@}
|
///@}
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ namespace mm {
|
||||||
// const methods
|
// const methods
|
||||||
|
|
||||||
// nonconst methods
|
// nonconst methods
|
||||||
|
[[noreturn]] void * alloc_copy(Opaque, std::byte *) override;
|
||||||
[[noreturn]] void visit_child(Opaque, AGCObject *, void **) const noexcept override;
|
[[noreturn]] void visit_child(Opaque, AGCObject *, void **) const noexcept override;
|
||||||
|
|
||||||
///@}
|
///@}
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,9 @@ namespace mm {
|
||||||
// const methods
|
// const methods
|
||||||
|
|
||||||
// non-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 {
|
void visit_child(Opaque data, AGCObject * iface, void ** pp_data) const noexcept override {
|
||||||
return I::visit_child(_dcast(data), iface, pp_data);
|
return I::visit_child(_dcast(data), iface, pp_data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,9 @@ public:
|
||||||
// const methods
|
// const methods
|
||||||
|
|
||||||
// non-const methods (still const in router!)
|
// 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 {
|
void visit_child(AGCObject * iface, void ** pp_data) noexcept {
|
||||||
return O::iface()->visit_child(O::data(), iface, pp_data);
|
return O::iface()->visit_child(O::data(), iface, pp_data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,12 @@ IGCObjectVisitor_Any::_valid
|
||||||
|
|
||||||
// nonconst methods
|
// nonconst methods
|
||||||
|
|
||||||
|
auto
|
||||||
|
IGCObjectVisitor_Any::alloc_copy(Opaque, std::byte *) -> void *
|
||||||
|
{
|
||||||
|
_fatal();
|
||||||
|
}
|
||||||
|
|
||||||
auto
|
auto
|
||||||
IGCObjectVisitor_Any::visit_child(Opaque, AGCObject *, void **) const noexcept -> void
|
IGCObjectVisitor_Any::visit_child(Opaque, AGCObject *, void **) const noexcept -> void
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue