1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-09 12:50:35 +00:00

Merge pull request #78987 from RandomShaper/err_bad_deferred_target

Let user know about dead instances in deferred calls
This commit is contained in:
Yuri Sizov
2023-07-26 18:39:38 +02:00

View File

@@ -35,6 +35,10 @@
#include "core/object/class_db.h" #include "core/object/class_db.h"
#include "core/object/script_language.h" #include "core/object/script_language.h"
#ifdef DEBUG_ENABLED
#include "core/config/engine.h"
#endif
#ifdef DEV_ENABLED #ifdef DEV_ENABLED
// Includes sanity checks to ensure that a queue set as a thread singleton override // Includes sanity checks to ensure that a queue set as a thread singleton override
// is only ever called from the thread it was set for. // is only ever called from the thread it was set for.
@@ -316,7 +320,15 @@ Error CallQueue::flush() {
Object *target = message->callable.get_object(); Object *target = message->callable.get_object();
UNLOCK_MUTEX; UNLOCK_MUTEX;
#ifdef DEBUG_ENABLED
if (!message->callable.is_valid()) {
// The editor would cause many of these.
if (!Engine::get_singleton()->is_editor_hint()) {
ERR_PRINT("Trying to execute a deferred call/notification/set on a previously freed instance. Consider using queue_free() instead of free().");
}
} else
#endif
{
switch (message->type & FLAG_MASK) { switch (message->type & FLAG_MASK) {
case TYPE_CALL: { case TYPE_CALL: {
if (target || (message->type & FLAG_NULL_IS_OK)) { if (target || (message->type & FLAG_NULL_IS_OK)) {
@@ -336,6 +348,7 @@ Error CallQueue::flush() {
} }
} break; } break;
} }
}
if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) { if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) {
Variant *args = (Variant *)(message + 1); Variant *args = (Variant *)(message + 1);