diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-02-21 11:47:08 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-03-09 21:36:30 +0100 |
commit | 2a21efb5f7a6cac6f6101f2f42fe38f16dc68149 (patch) | |
tree | 9e499bb9ac29f76faa73a43a972ce86de4fa891c /src/qml/qml/qqmlglobal.cpp | |
parent | e37d2dac8ae680d36a531f0388ec3216e5dfb366 (diff) |
QmlCompiler: Use value type ctors
This allows us to do the relevant conversions in a more civilized way,
dropping the outputVariantConversion() method. The latter is brittle
because you have to manually add it to each instruction, and it uses
QMetaType::convert() which is actually not guaranteed to give the same
results as a QML type coercion.
Task-number: QTBUG-94807
Change-Id: I4d6d05a60beb3b4dfc3da6f0142de25667510904
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlglobal.cpp')
-rw-r--r-- | src/qml/qml/qqmlglobal.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp index 90889c2ea4..aa899b2592 100644 --- a/src/qml/qml/qqmlglobal.cpp +++ b/src/qml/qml/qqmlglobal.cpp @@ -94,6 +94,17 @@ static void callConstructor( } template<typename Allocate> +static void fromVerifiedType( + const QMetaObject *mo, int ctorIndex, void *sData, Allocate &&allocate) +{ + const QMetaMethod ctor = mo->constructor(ctorIndex); + Q_ASSERT_X(ctor.parameterCount() == 1, "fromVerifiedType", + "Value type constructor must take exactly one argument"); + callConstructor(mo, ctorIndex, sData, allocate()); +} + + +template<typename Allocate> static bool fromMatchingType( const QMetaObject *mo, const QV4::Value &s, Allocate &&allocate) { @@ -299,6 +310,16 @@ bool QQmlValueTypeProvider::createValueType(const QV4::Value &s, QMetaType metaT return false; } +QVariant QQmlValueTypeProvider::constructValueType( + QMetaType resultMetaType, const QMetaObject *resultMetaObject, + int ctorIndex, void *ctorArg) +{ + QVariant result; + fromVerifiedType(resultMetaObject, ctorIndex, ctorArg, + [&]() { return createVariantData(resultMetaType, &result); }); + return result; +} + static QVariant fromJSValue(const QQmlType &type, const QJSValue &s, QMetaType metaType) { if (const auto valueTypeFunction = type.createValueTypeFunction()) { |