From 05b840a8153919e27c8e069d81cf6766b23b450b Mon Sep 17 00:00:00 2001 From: Zae Date: Thu, 2 Jan 2025 05:05:43 +0800 Subject: [PATCH] C#: Fix `RefCounted` not disposed correctly in certain case. --- modules/mono/glue/runtime_interop.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/mono/glue/runtime_interop.cpp b/modules/mono/glue/runtime_interop.cpp index 6975c0bbf4f..cb9ab3f7446 100644 --- a/modules/mono/glue/runtime_interop.cpp +++ b/modules/mono/glue/runtime_interop.cpp @@ -203,6 +203,11 @@ void godotsharp_internal_refcounted_disposed(Object *p_ptr, GCHandleIntPtr p_gch CSharpScriptBinding &script_binding = ((RBMap::Element *)data)->get(); if (script_binding.inited) { if (!script_binding.gchandle.is_released()) { + if (rc->get_reference_count() == 1 && script_binding.gchandle.is_weak()) { + // The GCHandle is just swapped, so get the swapped handle to release + // See: CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference) + p_gchandle_to_free = script_binding.gchandle.get_intptr(); + } CSharpLanguage::release_binding_gchandle_thread_safe(p_gchandle_to_free, script_binding); } }