Browse Source

MessageQueue::flush now always destroys parameters of a spent message

Previously, destructors of Variant parameters were not called if the
target of the message was not found.

(cherry picked from commit 5626a1ec20b8df3faa0afd54787d08ccebed927d)
Ibrahn Sahir 6 years ago
parent
commit
6d57ebed1a
1 changed files with 7 additions and 5 deletions
  1. 7 5
      core/message_queue.cpp

+ 7 - 5
core/message_queue.cpp

@@ -302,10 +302,6 @@ void MessageQueue::flush() {
 
 
 					_call_function(target, message->target, args, message->args, message->type & FLAG_SHOW_ERROR);
 					_call_function(target, message->target, args, message->args, message->type & FLAG_SHOW_ERROR);
 
 
-					for (int i = 0; i < message->args; i++) {
-						args[i].~Variant();
-					}
-
 				} break;
 				} break;
 				case TYPE_NOTIFICATION: {
 				case TYPE_NOTIFICATION: {
 
 
@@ -319,11 +315,17 @@ void MessageQueue::flush() {
 					// messages don't expect a return value
 					// messages don't expect a return value
 					target->set(message->target, *arg);
 					target->set(message->target, *arg);
 
 
-					arg->~Variant();
 				} break;
 				} break;
 			}
 			}
 		}
 		}
 
 
+		if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) {
+			Variant *args = (Variant *)(message + 1);
+			for (int i = 0; i < message->args; i++) {
+				args[i].~Variant();
+			}
+		}
+
 		message->~Message();
 		message->~Message();
 
 
 		_THREAD_SAFE_LOCK_
 		_THREAD_SAFE_LOCK_