Always return early if no signal is connected

And simply emit the signal spy and tracing callbacks in
that code path as well.

Change-Id: I17f65055c7044caf1be58fac94bb7fe3487f3060
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
This commit is contained in:
Lars Knoll 2019-01-04 14:55:28 +01:00
parent 1d1e801cba
commit 88a2a746b7

View File

@ -3668,12 +3668,14 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
Q_TRACE(QMetaObject_activate_end_declarative_signal, sender, signal_index); Q_TRACE(QMetaObject_activate_end_declarative_signal, sender, signal_index);
} }
if (!sender->d_func()->isSignalConnected(signal_index, /*checkDeclarative =*/ false) if (!sender->d_func()->isSignalConnected(signal_index, /*checkDeclarative =*/ false)) {
&& !qt_signal_spy_callback_set.signal_begin_callback // The possible declarative connection is done, and nothing else is connected
&& !qt_signal_spy_callback_set.signal_end_callback if (qt_signal_spy_callback_set.signal_begin_callback != nullptr)
&& !Q_TRACE_ENABLED(QMetaObject_activate_begin_signal) qt_signal_spy_callback_set.signal_begin_callback(sender, signal_index, argv);
&& !Q_TRACE_ENABLED(QMetaObject_activate_end_signal)) { Q_TRACE(QMetaObject_activate_begin_signal, sender, signal_index);
// The possible declarative connection is done, and nothing else is connected, so: Q_TRACE(QMetaObject_activate_end_signal, sender, signal_index);
if (qt_signal_spy_callback_set.signal_end_callback != nullptr)
qt_signal_spy_callback_set.signal_end_callback(sender, signal_index);
return; return;
} }
@ -3711,13 +3713,6 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
QObjectConnectionListVector *operator->() const { return connectionLists; } QObjectConnectionListVector *operator->() const { return connectionLists; }
}; };
ConnectionListsRef connectionLists = sender->d_func()->connectionLists; ConnectionListsRef connectionLists = sender->d_func()->connectionLists;
if (!connectionLists.connectionLists) {
locker.unlock();
if (qt_signal_spy_callback_set.signal_end_callback != 0)
qt_signal_spy_callback_set.signal_end_callback(sender, signal_index);
Q_TRACE(QMetaObject_activate_end_signal, sender, signal_index);
return;
}
const QObjectPrivate::ConnectionList *list; const QObjectPrivate::ConnectionList *list;
if (signal_index < connectionLists->count()) if (signal_index < connectionLists->count())