diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2024-04-11 09:57:59 -0700 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2024-04-26 18:19:36 +0200 |
commit | c14f399d2ab42fa612121e805d8ec1e63747ccd6 (patch) | |
tree | f0b3a01b37460dbc0b03d7bd7a9e7d8d43d7c586 /src | |
parent | 4ae6f40b3a2e2fe4f617a1c911c8d066c18cdab9 (diff) |
QTest: rip out qxp::function_ref from reportResult()
This is causing huge code bloat because everything is a local lambda.
Instead, pass direct type-erased function and data pointers to the
replacement function. Testing with tst_qcborvalue, this reduces the
compilation time and the output binary size significantly:
Before After
Compiler Time Size Time Size
GCC 13.2 136.99 s 202.3 MB 13.88 s 14.3 MB
GCC 14.0 131.49 s 202.7 MB 14.69 s 14.4 MB
Clang 17 77.2 s 146.7 MB 13.62 s 12.2 MB
Clang 18 141.9 s 187.1 MB 13.62 s 12.4 MB
This causes a difference in how toString() overloads are
found. Previously it would match far more overloads because the
toString() calls were expanded by the macro. Now, we depend on
Argument-Dependent Lookup and associated namespaces, so toString()
overloads should not be in the QTest namespace any more.
With this patch applied, the testlib testcase of tst_selftest
started failing, because nullptr is now handled differently.
However, I consider it as a bugfix, because previously it was
falling back to a default implementation, and now it is using
the QTest::toString(std::nullptr_t) overload, which is a
desired behavior. Update the reference files for tst_selftest
with the new expected output.
Task-number: QTBUG-124272
Change-Id: Ie28eadac333c4bcd8c08fffd17c5484186accdf6
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/testlib/qtest_network.h | 9 | ||||
-rw-r--r-- | src/testlib/qtest_widgets.h | 9 | ||||
-rw-r--r-- | src/testlib/qtestcase.cpp | 28 | ||||
-rw-r--r-- | src/testlib/qtestcase.h | 37 | ||||
-rw-r--r-- | src/testlib/qtestcase.qdoc | 12 | ||||
-rw-r--r-- | src/testlib/qtestresult.cpp | 9 | ||||
-rw-r--r-- | src/testlib/qtestresult_p.h | 6 |
7 files changed, 85 insertions, 25 deletions
diff --git a/src/testlib/qtest_network.h b/src/testlib/qtest_network.h index 61f80a536c..403a663ae2 100644 --- a/src/testlib/qtest_network.h +++ b/src/testlib/qtest_network.h @@ -4,7 +4,7 @@ #ifndef QTEST_NETWORK_H #define QTEST_NETWORK_H -#include <QtTest/qtest.h> +#include <QtTest/qtesttostring.h> // enable NETWORK features #ifndef QT_NETWORK_LIB @@ -43,6 +43,7 @@ inline char *toString<QHostAddress>(const QHostAddress &addr) return toString(addr.toString()); } +} // namespace QTest inline char *toString(QNetworkReply::NetworkError code) { @@ -57,7 +58,7 @@ inline char *toString(QNetworkReply::NetworkError code) inline char *toString(const QNetworkCookie &cookie) { - return toString(cookie.toRawForm()); + return QTest::toString(cookie.toRawForm()); } inline char *toString(const QList<QNetworkCookie> &list) @@ -69,11 +70,9 @@ inline char *toString(const QList<QNetworkCookie> &list) result.chop(2); // remove trailing ", " } result.append(')'); - return toString(result); + return QTest::toString(result); } -} // namespace QTest - QT_END_NAMESPACE #endif diff --git a/src/testlib/qtest_widgets.h b/src/testlib/qtest_widgets.h index 2b60d94fd7..90ee3aa6aa 100644 --- a/src/testlib/qtest_widgets.h +++ b/src/testlib/qtest_widgets.h @@ -62,15 +62,16 @@ inline QByteArray toString(QSizePolicy sp) } } // namespace Internal +} // namespace QTest inline char *toString(QSizePolicy::Policy p) { - return qstrdup(Internal::toString(p)); + return qstrdup(QTest::Internal::toString(p)); } inline char *toString(QSizePolicy::ControlTypes ct) { - return qstrdup(Internal::toString(ct).constData()); + return qstrdup(QTest::Internal::toString(ct).constData()); } inline char *toString(QSizePolicy::ControlType ct) @@ -80,11 +81,9 @@ inline char *toString(QSizePolicy::ControlType ct) inline char *toString(QSizePolicy sp) { - return qstrdup(Internal::toString(sp).constData()); + return qstrdup(QTest::Internal::toString(sp).constData()); } -} // namespace QTest - QT_END_NAMESPACE #endif diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index fb2b46d824..75c36066af 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -1745,14 +1745,33 @@ void TestMethods::invokeTests(QObject *testObject) const QSignalDumper::endDump(); } +#if QT_DEPRECATED_SINCE(6, 8) +static const char *functionRefFormatter(const void *f) +{ + auto formatter = static_cast<const qxp::function_ref<const char *()> *>(f); + return (*formatter)(); +}; + bool reportResult(bool success, qxp::function_ref<const char *()> lhs, qxp::function_ref<const char *()> rhs, const char *lhsExpr, const char *rhsExpr, ComparisonOperation op, const char *file, int line) { - return QTestResult::reportResult(success, lhs, rhs, lhsExpr, rhsExpr, op, file, line); + return QTestResult::reportResult(success, &lhs, &rhs, + functionRefFormatter, functionRefFormatter, + lhsExpr, rhsExpr, op, file, line); } +#endif // QT_DEPRECATED_SINCE(6, 8) +bool reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), + const char *lhsExpr, const char *rhsExpr, + ComparisonOperation op, const char *file, int line) +{ + return QTestResult::reportResult(success, lhs, rhs, lhsFormatter, rhsFormatter, + lhsExpr, rhsExpr, op, file, line); +} } // namespace QTest static void initEnvironment() @@ -2748,7 +2767,12 @@ bool QTest::compare_helper(bool success, const char *failureMsg, const char *actual, const char *expected, const char *file, int line) { - return QTestResult::reportResult(success, actualVal, expectedVal, actual, expected, + auto functionRefFormatter = [](const void *f) { + auto formatter = static_cast<const qxp::function_ref<const char *()> *>(f); + return (*formatter)(); + }; + return QTestResult::reportResult(success, &actualVal, &expectedVal, functionRefFormatter, + functionRefFormatter, actual, expected, QTest::ComparisonOperation::CustomCompare, file, line, failureMsg); } diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index 06fbd25c9c..6df20f8121 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -95,8 +95,7 @@ do { \ return QTest::reportResult(std::forward<decltype(qt_lhs_arg)>(qt_lhs_arg) \ op \ std::forward<decltype(qt_rhs_arg)>(qt_rhs_arg), \ - [&qt_lhs_arg] { return QTest::toString(qt_lhs_arg); }, \ - [&qt_rhs_arg] { return QTest::toString(qt_rhs_arg); }, \ + qt_lhs_arg, qt_rhs_arg, \ #lhs, #rhs, QTest::ComparisonOperation::opId, \ __FILE__, __LINE__); \ }(lhs, rhs)) { \ @@ -330,6 +329,18 @@ namespace QTest Q_TESTLIB_EXPORT QString formatTryTimeoutDebugMessage(q_no_char8_t::QUtf8StringView expr, int timeout, int actual); + template <typename T1> const char *genericToString(const void *arg) + { + using QTest::toString; + return toString(*static_cast<const T1 *>(arg)); + } + + template <> inline const char *genericToString<char *>(const void *arg) + { + using QTest::toString; + return toString(static_cast<const char *>(arg)); + } + // Exported so Qt Quick Test can also use it for generating backtraces upon crashes. Q_TESTLIB_EXPORT extern bool noCrashHandler; @@ -644,10 +655,32 @@ namespace QTest qMetaTypeId<T>())), actualStr, expected, file, line); } +#if QT_DEPRECATED_SINCE(6, 8) + QT_DEPRECATED_VERSION_X_6_8("use the overload without qxp::function_ref") Q_TESTLIB_EXPORT bool reportResult(bool success, qxp::function_ref<const char*()> lhs, qxp::function_ref<const char*()> rhs, const char *lhsExpr, const char *rhsExpr, ComparisonOperation op, const char *file, int line); +#endif // QT_DEPRECATED_SINCE(6, 8) + + Q_TESTLIB_EXPORT bool reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), + const char *lhsExpr, const char *rhsExpr, + ComparisonOperation op, const char *file, int line); + + template <typename T1, typename T2> + inline bool reportResult(bool result, const T1 &lhs, const T2 &rhs, + const char *lhsExpr, const char *rhsExpr, + ComparisonOperation op, const char *file, int line) + { + using D1 = std::decay_t<T1>; + using D2 = std::decay_t<T2>; + using Internal::genericToString; + return reportResult(result, std::addressof(lhs), std::addressof(rhs), + genericToString<D1>, genericToString<D2>, + lhsExpr, rhsExpr, op, file, line); + } } diff --git a/src/testlib/qtestcase.qdoc b/src/testlib/qtestcase.qdoc index 973899e4d3..2eb060b9af 100644 --- a/src/testlib/qtestcase.qdoc +++ b/src/testlib/qtestcase.qdoc @@ -1608,7 +1608,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy::ControlType ct) + \fn char *toString(QSizePolicy::ControlType ct) + \relates QTest \overload \since 5.5 @@ -1616,7 +1617,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy::ControlTypes cts) + \fn char *toString(QSizePolicy::ControlTypes cts) + \relates QTest \overload \since 5.5 @@ -1624,7 +1626,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy::Policy p) + \fn char *toString(QSizePolicy::Policy p) + \relates QTest \overload \since 5.5 @@ -1632,7 +1635,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy sp) + \fn char *toString(QSizePolicy sp) + \relates QTest \overload \since 5.5 diff --git a/src/testlib/qtestresult.cpp b/src/testlib/qtestresult.cpp index 093e9b58ef..7c5ce9ce54 100644 --- a/src/testlib/qtestresult.cpp +++ b/src/testlib/qtestresult.cpp @@ -628,8 +628,9 @@ static const char *failureMessageForOp(QTest::ComparisonOperation op) Q_UNREACHABLE_RETURN(""); } -bool QTestResult::reportResult(bool success, qxp::function_ref<const char *()> lhs, - qxp::function_ref<const char *()> rhs, +bool QTestResult::reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), const char *lhsExpr, const char *rhsExpr, QTest::ComparisonOperation op, const char *file, int line, const char *failureMessage) @@ -653,8 +654,8 @@ bool QTestResult::reportResult(bool success, qxp::function_ref<const char *()> l return checkStatement(success, msg, file, line); } - const std::unique_ptr<const char[]> lhsPtr{ lhs() }; - const std::unique_ptr<const char[]> rhsPtr{ rhs() }; + const std::unique_ptr<const char[]> lhsPtr{ lhsFormatter(lhs) }; + const std::unique_ptr<const char[]> rhsPtr{ rhsFormatter(rhs) }; if (!failureMessage) failureMessage = failureMessageForOp(op); diff --git a/src/testlib/qtestresult_p.h b/src/testlib/qtestresult_p.h index 48c2c34611..52607cc2ee 100644 --- a/src/testlib/qtestresult_p.h +++ b/src/testlib/qtestresult_p.h @@ -17,7 +17,6 @@ #include <QtTest/qttestglobal.h> #include <QtCore/qstringfwd.h> -#include <QtCore/qxpfunctional.h> #include <QtCore/private/qglobal_p.h> QT_BEGIN_NAMESPACE @@ -102,8 +101,9 @@ public: static void setCurrentAppName(const char *appName); static const char *currentAppName(); - static bool reportResult(bool success, qxp::function_ref<const char *()> lhs, - qxp::function_ref<const char *()> rhs, + static bool reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), const char *lhsExpr, const char *rhsExpr, QTest::ComparisonOperation op, const char *file, int line, const char *failureMessage = nullptr); |