Преглед изворни кода

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 година
родитељ
комит
6d57ebed1a
1 измењених фајлова са 7 додато и 5 уклоњено
  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);
 
-					for (int i = 0; i < message->args; i++) {
-						args[i].~Variant();
-					}
-
 				} break;
 				case TYPE_NOTIFICATION: {
 
@@ -319,11 +315,17 @@ void MessageQueue::flush() {
 					// messages don't expect a return value
 					target->set(message->target, *arg);
 
-					arg->~Variant();
 				} 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();
 
 		_THREAD_SAFE_LOCK_