diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-09-21 10:40:27 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-10-02 13:21:09 +0200 |
commit | 45594322fe91eadcd9b2d7b1d76c1a6662bc1472 (patch) | |
tree | d14e743f40351ca7a660984616b2500aa83032f5 /src/qml | |
parent | d621027babff9a30d56ab6af871a465108c9eaba (diff) |
Use factory functions and ctors for creating value types
As you can extend value types with QML_EXTENDED we may as well allow a
factory function in the extended type. Furthermore, if the original type
allows construction from QJSValue, we may just use that. In turn, we can
get rid of the value type providers now.
Change-Id: I9124ea47537eab6c33d7451080ab2fff942eaa7b
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/qml/qqml.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqml.h | 14 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal.cpp | 67 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal_p.h | 15 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlprivate.h | 53 | ||||
-rw-r--r-- | src/qml/qml/qqmlpropertyvalidator.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlstringconverters.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmltype.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmltype_p.h | 3 | ||||
-rw-r--r-- | src/qml/qml/qqmltype_p_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 8 |
14 files changed, 101 insertions, 80 deletions
diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp index 102bf22df5..d26a09b081 100644 --- a/src/qml/qml/qqml.cpp +++ b/src/qml/qml/qqml.cpp @@ -321,6 +321,7 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) nullptr, nullptr, noCreateReason, + type.createValueType, type.uri, type.version, nullptr, @@ -493,6 +494,7 @@ namespace QQmlPrivate { 0, nullptr, nullptr, + nullptr, uri, QTypeRevision::fromMajorVersion(versionMajor), diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index 758b0a51cf..be482c5277 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -172,6 +172,7 @@ int qmlRegisterAnonymousType(const char *uri, int versionMajor) 0, nullptr, nullptr, QString(), + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -206,6 +207,7 @@ int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMin nullptr, nullptr, reason, + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -237,6 +239,7 @@ int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMin nullptr, nullptr, reason, + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -275,6 +278,7 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve nullptr, nullptr, reason, + QQmlPrivate::ValueType<T, E>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -313,6 +317,7 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve nullptr, nullptr, reason, + QQmlPrivate::ValueType<T, E>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -344,6 +349,7 @@ int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const c QQmlPrivate::QmlMetaType<T>::list(), sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -373,6 +379,7 @@ int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const c QQmlPrivate::QmlMetaType<T>::list(), sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -402,6 +409,7 @@ int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor) QQmlPrivate::QmlMetaType<T>::list(), sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), nullptr, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -433,6 +441,7 @@ int qmlRegisterExtendedType(const char *uri, int versionMajor) nullptr, nullptr, QString(), + QQmlPrivate::ValueType<T, E>::create, uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -470,6 +479,7 @@ int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, QQmlPrivate::QmlMetaType<T>::list(), sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), + QQmlPrivate::ValueType<T, E>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -518,6 +528,7 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, QQmlPrivate::QmlMetaType<T>::list(), sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -548,6 +559,7 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, QQmlPrivate::QmlMetaType<T>::list(), sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), + QQmlPrivate::ValueType<T, void>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -585,6 +597,7 @@ int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int version QQmlPrivate::QmlMetaType<T>::list(), sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), + QQmlPrivate::ValueType<T, E>::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), @@ -838,6 +851,7 @@ inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, 0, nullptr, nullptr, + nullptr, uri, QTypeRevision::fromMajorVersion(versionMajor), diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index f32a2901c6..3f871d5c6a 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -118,6 +118,7 @@ int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, nullptr, nullptr, reason, + nullptr, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &staticMetaObject, diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp index 4d3c81037e..e3a5df382e 100644 --- a/src/qml/qml/qqmlglobal.cpp +++ b/src/qml/qml/qqmlglobal.cpp @@ -48,16 +48,6 @@ QT_BEGIN_NAMESPACE -QQmlValueTypeProvider::QQmlValueTypeProvider() - : next(nullptr) -{ -} - -QQmlValueTypeProvider::~QQmlValueTypeProvider() -{ - QQml_removeValueTypeProvider(this); -} - bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst) { const QMetaType metaType(type); @@ -67,15 +57,16 @@ bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst) return true; } -bool QQmlValueTypeProvider::createValueType(int type, const QJSValue &s, QVariant *data) +bool QQmlValueTypeProvider::createValueType(int type, const QJSValue &s, QVariant &data) { - Q_ASSERT(data); - - QQmlValueTypeProvider *p = this; - do { - if (p->create(type, s, data)) + const QQmlType qmlType = QQmlMetaType::qmlType(type, QQmlMetaType::TypeIdCategory::MetaType); + if (auto valueTypeFunction = qmlType.createValueTypeFunction()) { + QVariant result = valueTypeFunction(s); + if (result.userType() == type) { + data = std::move(result); return true; - } while ((p = p->next)); + } + } return false; } @@ -109,49 +100,11 @@ bool QQmlValueTypeProvider::writeValueType(int type, const void *src, QVariant& return true; } -bool QQmlValueTypeProvider::create(int, const QJSValue &, QVariant *) { return false; } - -struct ValueTypeProviderList { - QQmlValueTypeProvider nullProvider; - QQmlValueTypeProvider *head = &nullProvider; -}; - -Q_GLOBAL_STATIC(ValueTypeProviderList, valueTypeProviders) - -Q_QML_PRIVATE_EXPORT void QQml_addValueTypeProvider(QQmlValueTypeProvider *newProvider) -{ - if (ValueTypeProviderList *providers = valueTypeProviders()) { - newProvider->next = providers->head; - providers->head = newProvider; - } -} - -Q_QML_PRIVATE_EXPORT void QQml_removeValueTypeProvider(QQmlValueTypeProvider *oldProvider) -{ - if (ValueTypeProviderList *providers = valueTypeProviders()) { - QQmlValueTypeProvider *prev = providers->head; - if (prev == oldProvider) { - providers->head = oldProvider->next; - return; - } - - // singly-linked list removal - for (; prev; prev = prev->next) { - if (prev->next != oldProvider) - continue; // this is not the provider you're looking for - prev->next = oldProvider->next; - return; - } - - qWarning("QQml_removeValueTypeProvider: was asked to remove provider %p but it was not found", oldProvider); - } -} +Q_GLOBAL_STATIC(QQmlValueTypeProvider, valueTypeProvider) Q_AUTOTEST_EXPORT QQmlValueTypeProvider *QQml_valueTypeProvider() { - if (ValueTypeProviderList *providers = valueTypeProviders()) - return providers->head; - return nullptr; + return valueTypeProvider(); } QQmlColorProvider::~QQmlColorProvider() {} diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h index 98ef809f0a..365bb1aa15 100644 --- a/src/qml/qml/qqmlglobal_p.h +++ b/src/qml/qml/qqmlglobal_p.h @@ -219,28 +219,15 @@ inline void QQml_setParent_noEvent(QObject *object, QObject *parent) class Q_QML_PRIVATE_EXPORT QQmlValueTypeProvider { public: - QQmlValueTypeProvider(); - virtual ~QQmlValueTypeProvider(); - bool initValueType(int, QVariant&); - bool createValueType(int, const QJSValue &, QVariant *); + bool createValueType(int, const QJSValue &, QVariant &); bool equalValueType(int, const void *, const QVariant&); bool readValueType(const QVariant&, void *, int); bool writeValueType(int, const void *, QVariant&); - -private: - virtual bool create(int, const QJSValue ¶ms, QVariant *); - - friend Q_QML_PRIVATE_EXPORT void QQml_addValueTypeProvider(QQmlValueTypeProvider *); - friend Q_QML_PRIVATE_EXPORT void QQml_removeValueTypeProvider(QQmlValueTypeProvider *); - - QQmlValueTypeProvider *next; }; -Q_QML_PRIVATE_EXPORT void QQml_addValueTypeProvider(QQmlValueTypeProvider *); Q_AUTOTEST_EXPORT QQmlValueTypeProvider *QQml_valueTypeProvider(); - class Q_QML_PRIVATE_EXPORT QQmlColorProvider { public: diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 6eaf2063b5..b89d19b199 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -170,6 +170,7 @@ static QQmlTypePrivate *createQQmlType(QQmlMetaTypeData *data, const QString &el d->extraData.cd->userdata = type.userdata; d->extraData.cd->newFunc = type.create; d->extraData.cd->noCreationReason = type.noCreationReason; + d->extraData.cd->createValueTypeFunc = type.createValueType; d->baseMetaObject = type.metaObject; d->extraData.cd->attachedPropertiesFunc = type.attachedPropertiesFunction; d->extraData.cd->attachedPropertiesType = type.attachedPropertiesMetaObject; diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index dc25aa9f0a..45c9400934 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -485,7 +485,7 @@ void QQmlObjectCreator::setPropertyValue(const QQmlPropertyData *property, const case QMetaType::QColor: { QVariant data; if (QQml_valueTypeProvider()->createValueType( - QMetaType::QColor, compilationUnit->bindingValueAsString(binding), &data)) { + QMetaType::QColor, compilationUnit->bindingValueAsString(binding), data)) { property->writeProperty(_qobject, data.data(), propertyWriteFlags); } } @@ -568,7 +568,7 @@ void QQmlObjectCreator::setPropertyValue(const QQmlPropertyData *property, const case QMetaType::QQuaternion: { QVariant result; bool ok = QQml_valueTypeProvider()->createValueType( - propertyType, compilationUnit->bindingValueAsString(binding), &result); + propertyType, compilationUnit->bindingValueAsString(binding), result); assertOrNull(ok); Q_UNUSED(ok); property->writeProperty(_qobject, result.data(), propertyWriteFlags); diff --git a/src/qml/qml/qqmlprivate.h b/src/qml/qml/qqmlprivate.h index 00d277a9f7..6639ecbd26 100644 --- a/src/qml/qml/qqmlprivate.h +++ b/src/qml/qml/qqmlprivate.h @@ -58,6 +58,7 @@ #include <QtQml/qqmlparserstatus.h> #include <QtQml/qqmllist.h> #include <QtQml/qqmlpropertyvaluesource.h> +#include <QtQml/qjsvalue.h> #include <QtCore/qglobal.h> #include <QtCore/qvariant.h> @@ -109,7 +110,6 @@ public: }; -class QJSValue; class QJSEngine; class QQmlEngine; class QQmlCustomParser; @@ -163,6 +163,7 @@ namespace QQmlPrivate using CreateIntoFunction = void (*)(void *, void *); using CreateSingletonFunction = QObject *(*)(QQmlEngine *, QJSEngine *); using CreateParentFunction = QObject *(*)(QObject *); + using CreateValueTypeFunction = QVariant (*)(const QJSValue &); template<typename T, bool Constructible = isConstructible<T>()> struct Constructors; @@ -211,6 +212,51 @@ namespace QQmlPrivate static const QMetaObject *staticMetaObject() { return &T::staticMetaObject; } }; + template<typename F, typename Result = void> + struct ValueTypeFactory + { + static constexpr const Result (*create)(const QJSValue &) = nullptr; + }; + + template<typename F> + struct ValueTypeFactory<F, std::void_t<decltype(F::create(QJSValue()))>> + { + static decltype(F::create(QJSValue())) create(const QJSValue ¶ms) + { + return F::create(params); + } + }; + + template<typename T, typename F, + bool HasCtor = std::is_constructible_v<T, QJSValue>, + bool HasFactory = std::is_constructible_v< + QVariant, decltype(ValueTypeFactory<F>::create(QJSValue()))>> + struct ValueType; + + template<typename T, typename F> + struct ValueType<T, F, false, false> + { + static constexpr const CreateValueTypeFunction create = nullptr; + }; + + template<typename T, typename F, bool HasCtor> + struct ValueType<T, F, HasCtor, true> + { + static QVariant create(const QJSValue ¶ms) + { + return F::create(params); + } + }; + + template<typename T, typename F> + struct ValueType<T, F, true, false> + { + static QVariant create(const QJSValue ¶ms) + { + return QVariant::fromValue(T(params)); + } + }; + template<class From, class To, int N> struct StaticCastSelectorClass { @@ -348,6 +394,8 @@ namespace QQmlPrivate void *userdata; QString noCreationReason; + QVariant (*createValueType)(const QJSValue &); + const char *uri; QTypeRevision version; const char *elementName; @@ -378,6 +426,8 @@ namespace QQmlPrivate void (*create)(void *, void *); void *userdata; + QVariant (*createValueType)(const QJSValue &); + const char *uri; QTypeRevision version; @@ -676,6 +726,7 @@ namespace QQmlPrivate QmlMetaType<T>::list(), int(sizeof(T)), Constructors<T>::createInto, nullptr, + ValueType<T, E>::create, uri, QTypeRevision::fromMajorVersion(versionMajor), diff --git a/src/qml/qml/qqmlpropertyvalidator.cpp b/src/qml/qml/qqmlpropertyvalidator.cpp index 5bb3abd396..9ad5d3d42f 100644 --- a/src/qml/qml/qqmlpropertyvalidator.cpp +++ b/src/qml/qml/qqmlpropertyvalidator.cpp @@ -567,7 +567,7 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope QVariant result; if (!QQml_valueTypeProvider()->createValueType( property->propType(), - compilationUnit->bindingValueAsString(binding), &result)) { + compilationUnit->bindingValueAsString(binding), result)) { return warnOrError(tr("Invalid property assignment: %1 expected") .arg(typeName())); } diff --git a/src/qml/qml/qqmlstringconverters.cpp b/src/qml/qml/qqmlstringconverters.cpp index c7c111a052..9c2e715a6a 100644 --- a/src/qml/qml/qqmlstringconverters.cpp +++ b/src/qml/qml/qqmlstringconverters.cpp @@ -77,7 +77,7 @@ QVariant QQmlStringConverters::variantFromString(const QString &s, int preferred return QVariant::fromValue(rectFFromString(s, ok).toRect()); default: { QVariant ret; - bool success = QQml_valueTypeProvider()->createValueType(preferredType, QJSValue(s), &ret); + bool success = QQml_valueTypeProvider()->createValueType(preferredType, QJSValue(s), ret); if (ok) *ok = success; return ret; diff --git a/src/qml/qml/qqmltype.cpp b/src/qml/qml/qqmltype.cpp index bea69166c6..2c74d04ffc 100644 --- a/src/qml/qml/qqmltype.cpp +++ b/src/qml/qml/qqmltype.cpp @@ -63,6 +63,7 @@ QQmlTypePrivate::QQmlTypePrivate(QQmlType::RegistrationType type) extraData.cd = new QQmlCppTypeData; extraData.cd->allocationSize = 0; extraData.cd->newFunc = nullptr; + extraData.cd->createValueTypeFunc = nullptr; extraData.cd->parserStatusCast = -1; extraData.cd->extFunc = nullptr; extraData.cd->extMetaObject = nullptr; @@ -516,6 +517,13 @@ QQmlCustomParser *QQmlType::customParser() const return d->extraData.cd->customParser; } +QQmlType::CreateValueTypeFunc QQmlType::createValueTypeFunction() const +{ + if (!d || d->regType != CppType) + return nullptr; + return d->extraData.cd->createValueTypeFunc; +} + QQmlType::CreateFunc QQmlType::createFunction() const { if (!d || d->regType != CppType) diff --git a/src/qml/qml/qqmltype_p.h b/src/qml/qml/qqmltype_p.h index 025a1e5555..0655583e1e 100644 --- a/src/qml/qml/qqmltype_p.h +++ b/src/qml/qml/qqmltype_p.h @@ -104,6 +104,9 @@ public: bool availableInVersion(QTypeRevision version) const; bool availableInVersion(const QHashedStringRef &module, QTypeRevision version) const; + typedef QVariant (*CreateValueTypeFunc)(const QJSValue &); + CreateValueTypeFunc createValueTypeFunction() const; + QObject *create() const; void create(QObject **, void **, size_t) const; diff --git a/src/qml/qml/qqmltype_p_p.h b/src/qml/qml/qqmltype_p_p.h index cdd46aee7c..426b9ced37 100644 --- a/src/qml/qml/qqmltype_p_p.h +++ b/src/qml/qml/qqmltype_p_p.h @@ -116,6 +116,7 @@ public: void (*newFunc)(void *, void *); void *userdata = nullptr; QString noCreationReason; + QVariant (*createValueTypeFunc)(const QJSValue &); int parserStatusCast; QObject *(*extFunc)(QObject *); const QMetaObject *extMetaObject; diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 12e54f0895..3b6c448e49 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -463,7 +463,7 @@ ReturnedValue QtObject::method_font(const FunctionObject *b, const Value *, cons QVariant v; if (!QQml_valueTypeProvider()->createValueType( QMetaType::QFont, QJSValuePrivate::fromReturnedValue(argv[0].asReturnedValue()), - &v)) { + v)) { THROW_GENERIC_ERROR("Qt.font(): Invalid argument: no valid font subproperties specified"); } return scope.engine->fromVariant(v); @@ -483,7 +483,7 @@ static ReturnedValue createValueType(const FunctionObject *b, const Value *argv, params.setProperty(i, QJSValuePrivate::fromReturnedValue(argv[i].asReturnedValue())); QVariant variant; - QQml_valueTypeProvider()->createValueType(type, params, &variant); + QQml_valueTypeProvider()->createValueType(type, params, variant); return scope.engine->fromVariant(variant); } @@ -554,7 +554,7 @@ ReturnedValue QtObject::method_matrix4x4(const FunctionObject *b, const Value *, if (argc == 0) { QVariant variant; - QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, QJSValue(), &variant); + QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, QJSValue(), variant); return scope.engine->fromVariant(variant); } @@ -562,7 +562,7 @@ ReturnedValue QtObject::method_matrix4x4(const FunctionObject *b, const Value *, QVariant v; if (!QQml_valueTypeProvider()->createValueType( QMetaType::QMatrix4x4, - QJSValuePrivate::fromReturnedValue(argv[0].asReturnedValue()), &v)) { + QJSValuePrivate::fromReturnedValue(argv[0].asReturnedValue()), v)) { THROW_GENERIC_ERROR("Qt.matrix4x4(): Invalid argument: not a valid matrix4x4 values array"); } return scope.engine->fromVariant(v); |