diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-02-26 09:48:43 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-03-12 10:38:40 +0100 |
commit | f78e542053cfc1d5c1b26d6fa4d18ef1698359a0 (patch) | |
tree | 6786ce197dbf98f54e321c357e74bb3d5c29b8b3 /src/qml | |
parent | 547b4d2c2d9424fdcc694e291fe543a4f52cb684 (diff) |
Clean up type registration structs
* reset all structVersions to 0, removing checks for higher versions
* add structVerions where they are missing
* consistently check for compatibility in qqmlmetatype.cpp
* remove unused members
* rename RegisterSingletonFunctor
Fixes: QTBUG-82241
Change-Id: I74f1876b3298dbb60ff7cfab8c13e8ad4f9f8cdc
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/qml/qqml.cpp | 19 | ||||
-rw-r--r-- | src/qml/qml/qqml.h | 56 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 54 | ||||
-rw-r--r-- | src/qml/qml/qqmlprivate.h | 24 |
4 files changed, 78 insertions, 75 deletions
diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp index 79f853487c..28b48e2eee 100644 --- a/src/qml/qml/qqml.cpp +++ b/src/qml/qml/qqml.cpp @@ -79,7 +79,7 @@ int qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *q } // From qqmlprivate.h -QObject *QQmlPrivate::RegisterSingletonFunctor::operator()(QQmlEngine *qeng, QJSEngine *) +QObject *QQmlPrivate::SingletonFunctor::operator()(QQmlEngine *qeng, QJSEngine *) { if (!m_object) { QQmlError error; @@ -206,7 +206,7 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) ? QString() : QString::fromUtf8(classInfo(type.classInfoMetaObject, "QML.UncreatableReason")); RegisterType revisionRegistration = { - 1, + 0, type.typeId, type.listId, creatable ? type.objectSize : 0, @@ -264,18 +264,15 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) = *reinterpret_cast<RegisterSingletonTypeAndRevisions *>(data); const char *elementName = classElementName(type.classInfoMetaObject); RegisterSingletonType revisionRegistration = { - QmlCurrentSingletonTypeRegistrationVersion, + 0, type.uri, type.version, elementName, - - type.scriptApi, nullptr, + type.qObjectApi, type.instanceMetaObject, type.typeId, - QTypeRevision(), - - type.generalizedQobjectApi + QTypeRevision() }; const QTypeRevision added = revisionClassInfo( @@ -294,12 +291,10 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) // When removed, we still add revisions, but anonymous ones if (removed.isValid() && !(revision < removed)) { revisionRegistration.typeName = nullptr; - revisionRegistration.scriptApi = nullptr; - revisionRegistration.generalizedQobjectApi = nullptr; + revisionRegistration.qObjectApi = nullptr; } else { revisionRegistration.typeName = elementName; - revisionRegistration.scriptApi = type.scriptApi; - revisionRegistration.generalizedQobjectApi = type.generalizedQobjectApi; + revisionRegistration.qObjectApi = type.qObjectApi; } assignVersions(&revisionRegistration, revision, type.version); diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index fff1db5125..7404a62d23 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -228,7 +228,7 @@ template<typename T, int metaObjectRevision> int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) { QQmlPrivate::RegisterType type = { - 1, + 0, QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), @@ -302,7 +302,7 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve } QQmlPrivate::RegisterType type = { - 1, + 0, QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), @@ -363,7 +363,7 @@ template<typename T, int metaObjectRevision> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { QQmlPrivate::RegisterType type = { - 1, + 0, QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), @@ -392,7 +392,7 @@ template<typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor) { QQmlPrivate::RegisterType type = { - 1, + 0, QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), @@ -504,7 +504,7 @@ int qmlRegisterInterface(const char *typeName) QByteArray listName("QQmlListProperty<" + name + '>'); QQmlPrivate::RegisterInterface qmlInterface = { - 1, + 0, QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), @@ -522,7 +522,7 @@ template<typename T> int qmlRegisterInterface(const char *uri, int versionMajor) { QQmlPrivate::RegisterInterface qmlInterface = { - 1, + 0, QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), qobject_interface_iid<T *>(), @@ -569,7 +569,7 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) { QQmlPrivate::RegisterType type = { - 1, + 0, QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), @@ -690,24 +690,27 @@ inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versi uri, QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, - callback, nullptr, nullptr, QMetaType(), QTypeRevision::zero(), {} + callback, nullptr, nullptr, QMetaType(), QTypeRevision::zero() }; return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &api); } -enum { QmlCurrentSingletonTypeRegistrationVersion = 3 }; template <typename T> -inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, - QObject *(*callback)(QQmlEngine *, QJSEngine *)) +inline int qmlRegisterSingletonType( + const char *uri, int versionMajor, int versionMinor, const char *typeName, + QObject *(*callback)(QQmlEngine *, QJSEngine *)) { QQmlPrivate::RegisterSingletonType api = { - QmlCurrentSingletonTypeRegistrationVersion, - - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, - - - nullptr, nullptr, &T::staticMetaObject, QMetaType::fromType<T *>(), QTypeRevision::zero(), callback + 0, + uri, + QTypeRevision::fromVersion(versionMajor, versionMinor), + typeName, + nullptr, + callback, + &T::staticMetaObject, + QMetaType::fromType<T *>(), + QTypeRevision::zero() }; return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &api); @@ -719,12 +722,15 @@ inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versi F&& callback) { QQmlPrivate::RegisterSingletonType api = { - QmlCurrentSingletonTypeRegistrationVersion, - - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, - - - nullptr, nullptr, &T::staticMetaObject, QMetaType::fromType<T *>(), QTypeRevision::zero(), callback + 0, + uri, + QTypeRevision::fromVersion(versionMajor, versionMinor), + typeName, + nullptr, + callback, + &T::staticMetaObject, + QMetaType::fromType<T *>(), + QTypeRevision::zero() }; return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &api); @@ -734,7 +740,7 @@ template<typename T> inline auto qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, T *cppObject) -> typename std::enable_if<std::is_base_of<QObject, T>::value, int>::type { - QQmlPrivate::RegisterSingletonFunctor registrationFunctor; + QQmlPrivate::SingletonFunctor registrationFunctor; registrationFunctor.m_object = cppObject; return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, registrationFunctor); } @@ -748,6 +754,7 @@ inline int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versio } QQmlPrivate::RegisterCompositeSingletonType type = { + 0, url, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), @@ -766,6 +773,7 @@ inline int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, i } QQmlPrivate::RegisterCompositeType type = { + 0, url, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 0df8992079..c692986e74 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -92,12 +92,8 @@ static QQmlTypePrivate *createQQmlType(QQmlMetaTypeData *data, d->typeId = type.typeId; d->listId = type.listId; d->isSetup = true; - if (type.structVersion > 0) { - d->module = QString::fromUtf8(type.uri); - d->version = type.version; - } else { - d->version = QTypeRevision::zero(); - } + d->module = QString::fromUtf8(type.uri); + d->version = type.version; data->registerType(d); return d; } @@ -111,28 +107,18 @@ static QQmlTypePrivate *createQQmlType(QQmlMetaTypeData *data, const QString &el d->setName(QString::fromUtf8(type.uri), elementName); d->version = type.version; - if (type.qobjectApi || (type.structVersion >= 3 && type.generalizedQobjectApi)) { - if (type.structVersion >= 1) // static metaobject added in version 1 - d->baseMetaObject = type.instanceMetaObject; - if (type.structVersion >= 2) // typeId added in version 2 - d->typeId = type.typeId; - if (type.structVersion >= 2) // revisions added in version 2 - d->revision = type.revision; + if (type.qObjectApi) { + d->baseMetaObject = type.instanceMetaObject; + d->typeId = type.typeId; + d->revision = type.revision; } d->extraData.sd->singletonInstanceInfo = new QQmlType::SingletonInstanceInfo; d->extraData.sd->singletonInstanceInfo->scriptCallback = type.scriptApi; - if (type.structVersion >= 3) { - d->extraData.sd->singletonInstanceInfo->qobjectCallback = type.generalizedQobjectApi; - } else { - d->extraData.sd->singletonInstanceInfo->qobjectCallback = type.qobjectApi; - } + d->extraData.sd->singletonInstanceInfo->qobjectCallback = type.qObjectApi; d->extraData.sd->singletonInstanceInfo->typeName = QString::fromUtf8(type.typeName); d->extraData.sd->singletonInstanceInfo->instanceMetaObject - = ((type.qobjectApi || (type.structVersion >= 3 && type.generalizedQobjectApi) ) - && type.structVersion >= 1) - ? type.instanceMetaObject - : nullptr; + = type.qObjectApi ? type.instanceMetaObject : nullptr; return d; } @@ -145,8 +131,7 @@ static QQmlTypePrivate *createQQmlType(QQmlMetaTypeData *data, const QString &el d->setName(QString::fromUtf8(type.uri), elementName); d->version = type.version; - if (type.structVersion >= 1) // revisions added in version 1 - d->revision = type.revision; + d->revision = type.revision; d->typeId = type.typeId; d->listId = type.listId; d->extraData.cd->allocationSize = type.objectSize; @@ -328,11 +313,14 @@ void QQmlMetaType::clearTypeRegistrations() data->undeletableTypes.clear(); } -int QQmlMetaType::registerAutoParentFunction(const QQmlPrivate::RegisterAutoParent &autoparent) +int QQmlMetaType::registerAutoParentFunction(const QQmlPrivate::RegisterAutoParent &function) { + if (function.structVersion > 0) + qFatal("qmlRegisterType(): Cannot mix incompatible QML versions."); + QQmlMetaTypeDataPtr data; - data->parentFunctions.append(autoparent.function); + data->parentFunctions.append(function.function); return data->parentFunctions.count() - 1; } @@ -345,7 +333,7 @@ void QQmlMetaType::unregisterAutoParentFunction(const QQmlPrivate::AutoParentFun QQmlType QQmlMetaType::registerInterface(const QQmlPrivate::RegisterInterface &type) { - if (type.structVersion > 1) + if (type.structVersion > 0) qFatal("qmlRegisterType(): Cannot mix incompatible QML versions."); QQmlMetaTypeDataPtr data; @@ -459,6 +447,9 @@ void addTypeToData(QQmlTypePrivate *type, QQmlMetaTypeData *data) QQmlType QQmlMetaType::registerType(const QQmlPrivate::RegisterType &type) { + if (type.structVersion > 0) + qFatal("qmlRegisterType(): Cannot mix incompatible QML versions."); + QQmlMetaTypeDataPtr data; QString elementName = QString::fromUtf8(type.elementName); @@ -476,6 +467,9 @@ QQmlType QQmlMetaType::registerType(const QQmlPrivate::RegisterType &type) QQmlType QQmlMetaType::registerSingletonType(const QQmlPrivate::RegisterSingletonType &type) { + if (type.structVersion > 0) + qFatal("qmlRegisterType(): Cannot mix incompatible QML versions."); + QQmlMetaTypeDataPtr data; QString typeName = QString::fromUtf8(type.typeName); @@ -491,6 +485,9 @@ QQmlType QQmlMetaType::registerSingletonType(const QQmlPrivate::RegisterSingleto QQmlType QQmlMetaType::registerCompositeSingletonType(const QQmlPrivate::RegisterCompositeSingletonType &type) { + if (type.structVersion > 0) + qFatal("qmlRegisterType(): Cannot mix incompatible QML versions."); + // Assumes URL is absolute and valid. Checking of user input should happen before the URL enters type. QQmlMetaTypeDataPtr data; @@ -514,6 +511,9 @@ QQmlType QQmlMetaType::registerCompositeSingletonType(const QQmlPrivate::Registe QQmlType QQmlMetaType::registerCompositeType(const QQmlPrivate::RegisterCompositeType &type) { + if (type.structVersion > 0) + qFatal("qmlRegisterType(): Cannot mix incompatible QML versions."); + // Assumes URL is absolute and valid. Checking of user input should happen before the URL enters type. QQmlMetaTypeDataPtr data; diff --git a/src/qml/qml/qqmlprivate.h b/src/qml/qml/qqmlprivate.h index 968811e602..259deb5f32 100644 --- a/src/qml/qml/qqmlprivate.h +++ b/src/qml/qml/qqmlprivate.h @@ -400,7 +400,7 @@ namespace QQmlPrivate }; struct RegisterAutoParent { - int version; + int structVersion; AutoParentFunction function; }; @@ -413,12 +413,11 @@ namespace QQmlPrivate const char *typeName; QJSValue (*scriptApi)(QQmlEngine *, QJSEngine *); - QObject *(*qobjectApi)(QQmlEngine *, QJSEngine *); - const QMetaObject *instanceMetaObject; // new in version 1 - QMetaType typeId; // new in version 2 - QTypeRevision revision; // new in version 2 - std::function<QObject*(QQmlEngine *, QJSEngine *)> generalizedQobjectApi; // new in version 3 - // If this is extended ensure "version" is bumped!!! + std::function<QObject*(QQmlEngine *, QJSEngine *)> qObjectApi; + + const QMetaObject *instanceMetaObject; + QMetaType typeId; + QTypeRevision revision; }; struct RegisterSingletonTypeAndRevisions { @@ -426,16 +425,17 @@ namespace QQmlPrivate const char *uri; QTypeRevision version; - QJSValue (*scriptApi)(QQmlEngine *, QJSEngine *); + std::function<QObject*(QQmlEngine *, QJSEngine *)> qObjectApi; + const QMetaObject *instanceMetaObject; const QMetaObject *classInfoMetaObject; QMetaType typeId; - std::function<QObject*(QQmlEngine *, QJSEngine *)> generalizedQobjectApi; // new in version 3 QVector<int> *qmlTypeIds; }; struct RegisterCompositeType { + int structVersion; QUrl url; const char *uri; QTypeRevision version; @@ -443,6 +443,7 @@ namespace QQmlPrivate }; struct RegisterCompositeSingletonType { + int structVersion; QUrl url; const char *uri; QTypeRevision version; @@ -475,7 +476,7 @@ namespace QQmlPrivate int Q_QML_EXPORT qmlregister(RegistrationType, void *); void Q_QML_EXPORT qmlunregister(RegistrationType, quintptr); - struct Q_QML_EXPORT RegisterSingletonFunctor + struct Q_QML_EXPORT SingletonFunctor { QObject *operator()(QQmlEngine *, QJSEngine *); @@ -593,13 +594,12 @@ namespace QQmlPrivate uri, QTypeRevision::fromMajorVersion(versionMajor), - nullptr, + Constructors<T>::createSingletonInstance, &T::staticMetaObject, classInfoMetaObject, QMetaType::fromType<T *>(), - Constructors<T>::createSingletonInstance, qmlTypeIds }; |