From ba8b2a1ff0954771117062192a5bf4ed9deab427 Mon Sep 17 00:00:00 2001 From: Danil Alexeev Date: Tue, 24 Feb 2026 12:04:29 +0300 Subject: [PATCH] GDScript: Fix interrupted coroutines not clearing --- modules/gdscript/gdscript_function.cpp | 1 + .../runtime/features/coroutine_clearing.gd | 33 +++++++++++++++++++ .../runtime/features/coroutine_clearing.out | 8 +++++ 3 files changed, 42 insertions(+) create mode 100644 modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.gd create mode 100644 modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.out diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp index 03c7e7df86..307976d2b5 100644 --- a/modules/gdscript/gdscript_function.cpp +++ b/modules/gdscript/gdscript_function.cpp @@ -277,5 +277,6 @@ GDScriptFunctionState::~GDScriptFunctionState() { MutexLock lock(GDScriptLanguage::singleton->mutex); scripts_list.remove_from_list(); instances_list.remove_from_list(); + _clear_stack(); } } diff --git a/modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.gd b/modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.gd new file mode 100644 index 0000000000..4440a25083 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.gd @@ -0,0 +1,33 @@ +# GH-116706 + +class Instance: + func _init() -> void: + print("Instance _init") + + func _notification(what: int) -> void: + if what == NOTIFICATION_PREDELETE: + print("Instance predelete") + +class LocalOwner: + signal never_emitted() + + func _init() -> void: + print("LocalOwner _init") + + func _notification(what: int) -> void: + if what == NOTIFICATION_PREDELETE: + print("LocalOwner predelete") + + func interrupted_coroutine() -> void: + print("interrupted_coroutine begin") + var _instance := Instance.new() + await never_emitted + print("interrupted_coroutine end") + +func test(): + print("test begin") + var local_owner := LocalOwner.new() + @warning_ignore("missing_await") + local_owner.interrupted_coroutine() + local_owner = null + print("test end") diff --git a/modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.out b/modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.out new file mode 100644 index 0000000000..fb4f93bdcf --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/coroutine_clearing.out @@ -0,0 +1,8 @@ +GDTEST_OK +test begin +LocalOwner _init +interrupted_coroutine begin +Instance _init +LocalOwner predelete +Instance predelete +test end