Skip to content

Commit 558b29f

Browse files
authored
Merge pull request #848 from TitanNano/jovan/ret_ref_leak
RawGd::move_return_ptr with PtrcallType::Virtual leaks reference
2 parents 128c7ce + 7c71146 commit 558b29f

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

godot-core/src/obj/raw_gd.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -520,12 +520,14 @@ where
520520

521521
unsafe fn move_return_ptr(self, ptr: sys::GDExtensionTypePtr, call_type: PtrcallType) {
522522
if T::DynMemory::pass_as_ref(call_type) {
523-
interface_fn!(ref_set_object)(ptr as sys::GDExtensionRefPtr, self.obj_sys())
523+
// ref_set_object creates a new Ref<T> in the engine and increments the reference count. We have to drop our Gd<T> to decrement
524+
// the reference count again.
525+
interface_fn!(ref_set_object)(ptr as sys::GDExtensionRefPtr, self.obj_sys());
524526
} else {
525-
ptr::write(ptr as *mut _, self.obj)
527+
ptr::write(ptr as *mut _, self.obj);
528+
// We've passed ownership to caller.
529+
std::mem::forget(self);
526530
}
527-
// We've passed ownership to caller.
528-
std::mem::forget(self);
529531
}
530532
}
531533

0 commit comments

Comments
 (0)