summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2024-03-21 12:08:40 +0100
committerMarc Mutz <marc.mutz@qt.io>2024-04-24 21:36:49 +0200
commit88b5b1bce978c0e1a67e66561b65251439fe4281 (patch)
tree721da06f08e71044ddcdec514a867d5809797091 /src
parent2822b226109bc2e537e810b7c885baa2cb369588 (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.cpp82
-rw-r--r--src/testlib/qsignalspy.h83
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;