diff options
author | Marc Mutz <marc.mutz@qt.io> | 2024-03-21 12:08:40 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2024-04-24 21:36:49 +0200 |
commit | 88b5b1bce978c0e1a67e66561b65251439fe4281 (patch) | |
tree | 721da06f08e71044ddcdec514a867d5809797091 /src | |
parent | 2822b226109bc2e537e810b7c885baa2cb369588 (diff) |
QSignalSpy: de-inline private helpers
Reduces the code a compiler including qsignalspy.h needs to parse and
codegen.
The order of the functions in the .cpp file is chosen to minimize the
diffs to follow-up changes.
We can't de-inline the private ctor, because that would pin the vtable
to the qsignalspy.cpp TU, which would require us to export the class
wholesale to make the vtable accessible to users of the class, but we
can't export the class because it inherits QList.
Task-number: QTBUG-123544
Change-Id: Ib26fdb68e1fc0e6f6919e4cd25759b7047f9977c
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/testlib/qsignalspy.cpp | 82 | ||||
-rw-r--r-- | src/testlib/qsignalspy.h | 83 |
2 files changed, 87 insertions, 78 deletions
diff --git a/src/testlib/qsignalspy.cpp b/src/testlib/qsignalspy.cpp index 13c34c7751..3de14e16da 100644 --- a/src/testlib/qsignalspy.cpp +++ b/src/testlib/qsignalspy.cpp @@ -147,4 +147,86 @@ QT_BEGIN_NAMESPACE \endcode */ +bool QSignalSpy::isSignalMetaMethodValid(const QMetaMethod &signal) +{ + if (!signal.isValid()) { + qWarning("QSignalSpy: Null signal is not valid"); + return false; + } + + if (signal.methodType() != QMetaMethod::Signal) { + qWarning("QSignalSpy: Not a signal: '%s'", signal.methodSignature().constData()); + return false; + } + + return true; +} + +bool QSignalSpy::isObjectValid(const QObject *object) +{ + const bool valid = !!object; + + if (!valid) + qWarning("QSignalSpy: Cannot spy on a null object"); + + return valid; +} + +void QSignalSpy::initArgs(const QMetaMethod &member, const QObject *obj) +{ + QMutexLocker locker(&m_mutex); + args.reserve(member.parameterCount()); + for (int i = 0; i < member.parameterCount(); ++i) { + QMetaType tp = member.parameterMetaType(i); + if (!tp.isValid() && obj) { + locker.unlock(); + void *argv[] = { &tp, &i }; + QMetaObject::metacall(const_cast<QObject*>(obj), + QMetaObject::RegisterMethodArgumentMetaType, + member.methodIndex(), argv); + locker.relock(); + } + if (!tp.isValid()) { + qWarning("QSignalSpy: Unable to handle parameter '%s' of type '%s' of method '%s'," + " use qRegisterMetaType to register it.", + member.parameterNames().at(i).constData(), + member.parameterTypes().at(i).constData(), + member.name().constData()); + } + args << tp.id(); + } +} + +bool QSignalSpy::connectToSignal(const QObject *sender, int sigIndex) +{ + static const int memberOffset = QObject::staticMetaObject.methodCount(); + const bool connected = QMetaObject::connect( + sender, sigIndex, this, memberOffset, Qt::DirectConnection, nullptr); + + if (!connected) + qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); + + return connected; +} + +void QSignalSpy::appendArgs(void **a) +{ + QMutexLocker locker(&m_mutex); + QList<QVariant> list; + list.reserve(args.size()); + for (qsizetype i = 0; i < args.size(); ++i) { + const QMetaType::Type type = static_cast<QMetaType::Type>(args.at(i)); + if (type == QMetaType::QVariant) + list << *reinterpret_cast<QVariant *>(a[i + 1]); + else + list << QVariant(QMetaType(type), a[i + 1]); + } + append(std::move(list)); + + if (m_waiting) { + locker.unlock(); + m_loop.exitLoop(); + } +} + QT_END_NAMESPACE diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h index 7809ac3f71..7ae58ba82b 100644 --- a/src/testlib/qsignalspy.h +++ b/src/testlib/qsignalspy.h @@ -126,87 +126,14 @@ private: sig = os.sig.methodSignature(); } - bool connectToSignal(const QObject *sender, int sigIndex) - { - static const int memberOffset = QObject::staticMetaObject.methodCount(); - const bool connected = QMetaObject::connect( - sender, sigIndex, this, memberOffset, Qt::DirectConnection, nullptr); - - if (!connected) - qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); - - return connected; - } - - static bool isSignalMetaMethodValid(const QMetaMethod &signal) - { - if (!signal.isValid()) { - qWarning("QSignalSpy: Null signal is not valid"); - return false; - } - if (signal.methodType() != QMetaMethod::Signal) { - qWarning("QSignalSpy: Not a signal: '%s'", signal.methodSignature().constData()); - return false; - } - - return true; - } + Q_TESTLIB_EXPORT bool connectToSignal(const QObject *sender, int sigIndex); - static bool isObjectValid(const QObject *object) - { - const bool valid = !!object; - - if (!valid) - qWarning("QSignalSpy: Cannot spy on a null object"); - - return valid; - } + Q_TESTLIB_EXPORT static bool isSignalMetaMethodValid(const QMetaMethod &signal); + Q_TESTLIB_EXPORT static bool isObjectValid(const QObject *object); - void initArgs(const QMetaMethod &member, const QObject *obj) - { - QMutexLocker locker(&m_mutex); - args.reserve(member.parameterCount()); - for (int i = 0; i < member.parameterCount(); ++i) { - QMetaType tp = member.parameterMetaType(i); - if (!tp.isValid() && obj) { - locker.unlock(); - void *argv[] = { &tp, &i }; - QMetaObject::metacall(const_cast<QObject*>(obj), - QMetaObject::RegisterMethodArgumentMetaType, - member.methodIndex(), argv); - locker.relock(); - } - if (!tp.isValid()) { - qWarning("QSignalSpy: Unable to handle parameter '%s' of type '%s' of method '%s'," - " use qRegisterMetaType to register it.", - member.parameterNames().at(i).constData(), - member.parameterTypes().at(i).constData(), - member.name().constData()); - } - args << tp.id(); - } - } - - void appendArgs(void **a) - { - QMutexLocker locker(&m_mutex); - QList<QVariant> list; - list.reserve(args.size()); - for (qsizetype i = 0; i < args.size(); ++i) { - const QMetaType::Type type = static_cast<QMetaType::Type>(args.at(i)); - if (type == QMetaType::QVariant) - list << *reinterpret_cast<QVariant *>(a[i + 1]); - else - list << QVariant(QMetaType(type), a[i + 1]); - } - append(std::move(list)); - - if (m_waiting) { - locker.unlock(); - m_loop.exitLoop(); - } - } + Q_TESTLIB_EXPORT void initArgs(const QMetaMethod &member, const QObject *obj); + Q_TESTLIB_EXPORT void appendArgs(void **a); // the full, normalized signal name QByteArray sig; |