GDScript: Fix and simplify coroutine stack clearing

This commit is contained in:
Danil Alexeev 2026-03-04 10:24:08 +03:00
parent 74b5be24f4
commit 8a09a2f88c
No known key found for this signature in database
GPG key ID: 5A52F75A8679EC57
5 changed files with 72 additions and 36 deletions

View file

@ -1,13 +1,16 @@
# GH-116706
class Instance:
func _init() -> void:
print("Instance _init")
func _to_string() -> String:
return "<Instance>"
func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE:
print("Instance predelete")
# GH-116706
class LocalOwner:
signal never_emitted()
@ -24,10 +27,52 @@ class LocalOwner:
await never_emitted
print("interrupted_coroutine end")
func test():
print("test begin")
func subtest_order():
print("subtest_order begin")
var local_owner := LocalOwner.new()
@warning_ignore("missing_await")
local_owner.interrupted_coroutine()
local_owner = null
print("test end")
print("subtest_order end")
# GH-117049
signal tick()
func await_before_and_after() -> void:
await tick
var packed_array: PackedStringArray = ["abc"]
var instance := Instance.new()
await tick
prints(packed_array, instance)
func await_two_after() -> void:
var packed_array: PackedStringArray = ["abc"]
var instance := Instance.new()
await tick
await tick
prints(packed_array, instance)
func subtest_resume():
print("subtest_resume begin")
@warning_ignore("missing_await")
await_before_and_after()
tick.emit()
tick.emit()
print("---")
@warning_ignore("missing_await")
await_two_after()
tick.emit()
tick.emit()
print("subtest_resume end")
# ===
func test():
subtest_order()
print("===")
subtest_resume()

View file

@ -1,8 +1,18 @@
GDTEST_OK
test begin
subtest_order begin
LocalOwner _init
interrupted_coroutine begin
Instance _init
LocalOwner predelete
Instance predelete
test end
subtest_order end
===
subtest_resume begin
Instance _init
["abc"] <Instance>
Instance predelete
---
Instance _init
["abc"] <Instance>
Instance predelete
subtest_resume end