From 3a6527d6d3c15bc052b9f27ccb1b4ad7c10c135f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Mon, 3 Jul 2023 17:42:17 +0200 Subject: [PATCH] Let user know about dead instances in deferred calls --- core/object/message_queue.cpp | 51 ++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/core/object/message_queue.cpp b/core/object/message_queue.cpp index 18ba5d5b300..701636e71b8 100644 --- a/core/object/message_queue.cpp +++ b/core/object/message_queue.cpp @@ -35,6 +35,10 @@ #include "core/object/class_db.h" #include "core/object/script_language.h" +#ifdef DEBUG_ENABLED +#include "core/config/engine.h" +#endif + #ifdef DEV_ENABLED // 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. @@ -312,25 +316,34 @@ Error CallQueue::flush() { Object *target = message->callable.get_object(); UNLOCK_MUTEX; - - switch (message->type & FLAG_MASK) { - case TYPE_CALL: { - if (target || (message->type & FLAG_NULL_IS_OK)) { - Variant *args = (Variant *)(message + 1); - _call_function(message->callable, args, message->args, message->type & FLAG_SHOW_ERROR); - } - } break; - case TYPE_NOTIFICATION: { - if (target) { - target->notification(message->notification); - } - } break; - case TYPE_SET: { - if (target) { - Variant *arg = (Variant *)(message + 1); - target->set(message->callable.get_method(), *arg); - } - } break; +#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) { + case TYPE_CALL: { + if (target || (message->type & FLAG_NULL_IS_OK)) { + Variant *args = (Variant *)(message + 1); + _call_function(message->callable, args, message->args, message->type & FLAG_SHOW_ERROR); + } + } break; + case TYPE_NOTIFICATION: { + if (target) { + target->notification(message->notification); + } + } break; + case TYPE_SET: { + if (target) { + Variant *arg = (Variant *)(message + 1); + target->set(message->callable.get_method(), *arg); + } + } break; + } } if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) {