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