summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/object/message_queue.cpp51
1 files changed, 32 insertions, 19 deletions
diff --git a/core/object/message_queue.cpp b/core/object/message_queue.cpp
index 18ba5d5b30..701636e71b 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) {