aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-06-07 09:27:39 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-06-08 05:21:34 +0000
commit5769841f103261edc2e2cf881e7ba7fd6f3846b5 (patch)
tree6b88562c9b279a55aedac4edc194f7050552bcdb
parent4c0a423154543c119f0e51dd5c05e9d7fc24345a (diff)
QML: Re-add QMetaType::convert() attempt for argument conversion
There are people who depend on QMetaType to convert their types. This is not nice, but removing it breaks compatibility. Fixes: QTBUG-114340 Change-Id: I0a7f54b8fd0f77b71e7e56f65ef7d6f91c876237 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit 761b455d4741bdbef47845623d6f44bdc8a464b5) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp6
-rw-r--r--tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml5
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.cpp1
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.h6
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp2
5 files changed, 17 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index f937ee2ca5..a8db3e95a4 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -2195,7 +2195,11 @@ bool CallArgument::fromValue(QMetaType metaType, ExecutionEngine *engine, const
qvariantPtr = new (&allocData) QVariant(metaType);
type = QVariantWrappedType;
- return ExecutionEngine::metaTypeFromJS(value, metaType, qvariantPtr->data());
+ if (ExecutionEngine::metaTypeFromJS(value, metaType, qvariantPtr->data()))
+ return true;
+
+ const QVariant v = ExecutionEngine::toVariant(value, metaType);
+ return QMetaType::convert(v.metaType(), v.constData(), metaType, qvariantPtr->data());
}
ReturnedValue CallArgument::toValue(ExecutionEngine *engine)
diff --git a/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml b/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml
index ecf2130f5a..e0cebe58fc 100644
--- a/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml
+++ b/tests/auto/qml/qqmllanguage/data/unregisteredValueTypeConversion.qml
@@ -2,5 +2,8 @@ import QtQml
import Test
UnregisteredValueTypeHandler {
- Component.onCompleted: consume(produce())
+ Component.onCompleted: {
+ consume(produce())
+ consume(produceDerived())
+ }
}
diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp
index f703eece2a..e320cae8ae 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.cpp
+++ b/tests/auto/qml/qqmllanguage/testtypes.cpp
@@ -154,6 +154,7 @@ void registerTypes()
qmlRegisterTypesAndRevisions<ObjectWithEnums>("TypedEnums", 1);
qmlRegisterTypesAndRevisions<GadgetWithEnums>("TypedEnums", 1);
+ QMetaType::registerConverter<UnregisteredValueDerivedType, UnregisteredValueBaseType>();
qmlRegisterTypesAndRevisions<UnregisteredValueTypeHandler>("Test", 1);
}
diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h
index a16580e3f8..7545fd251a 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.h
+++ b/tests/auto/qml/qqmllanguage/testtypes.h
@@ -2572,6 +2572,11 @@ struct UnregisteredValueBaseType
int foo = 12;
};
+struct UnregisteredValueDerivedType: public UnregisteredValueBaseType
+{
+ int bar = 13;
+};
+
class UnregisteredValueTypeHandler: public QObject
{
Q_OBJECT
@@ -2581,6 +2586,7 @@ public:
public slots:
UnregisteredValueBaseType produce() { return UnregisteredValueBaseType(); }
+ UnregisteredValueDerivedType produceDerived() { return UnregisteredValueDerivedType(); }
void consume(UnregisteredValueBaseType) { ++consumed; }
};
diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
index 7bef01f3eb..2ce2185f29 100644
--- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
+++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
@@ -7998,7 +7998,7 @@ void tst_qqmllanguage::unregisteredValueTypeConversion()
QVERIFY(!o.isNull());
UnregisteredValueTypeHandler *handler = qobject_cast<UnregisteredValueTypeHandler *>(o.data());
Q_ASSERT(handler);
- QCOMPARE(handler->consumed, 1);
+ QCOMPARE(handler->consumed, 2);
}
QTEST_MAIN(tst_qqmllanguage)