fix(playable): close release validation lifecycle gaps

This commit is contained in:
shen
2026-09-11 21:23:44 +08:00
parent f39a55fdd5
commit cc5573ddc1
13 changed files with 230 additions and 7 deletions
+11 -2
View File
@@ -77,7 +77,7 @@ func snapshot() -> Dictionary:
func disconnect_all() -> void:
for entry in _connections:
var source: Object = entry.source
var source: Object = entry.source.get_ref()
var signal_name: String = entry.signal
var callback: Callable = entry.callback
if source != null and is_instance_valid(source) and source.has_signal(signal_name) \
@@ -86,15 +86,24 @@ func disconnect_all() -> void:
_connections.clear()
func bound_count() -> int:
_prune_connections()
return _connections.size()
func _prune_connections() -> void:
for i in range(_connections.size() - 1, -1, -1):
if _connections[i].source.get_ref() == null:
_connections.remove_at(i)
func _exit_tree() -> void:
disconnect_all()
func _bind(source: Object, signal_name: String, callback: Callable) -> void:
# Registries are RefCounted and own parsed effect caches. Observing a scene
# must not keep it alive after reconnect; discard dead bindings on rebind.
_prune_connections()
if source.has_signal(signal_name) and not source.is_connected(signal_name, callback):
source.connect(signal_name, callback)
_connections.append({"source": source, "signal": signal_name, "callback": callback})
_connections.append({"source": weakref(source), "signal": signal_name, "callback": callback})
func _emit(kind: String, payload := {}, actor_vid := 0, target_vid := 0) -> void:
var data: Dictionary = payload.duplicate(true)