aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-02-26 09:48:43 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-03-12 10:38:40 +0100
commitf78e542053cfc1d5c1b26d6fa4d18ef1698359a0 (patch)
tree6786ce197dbf98f54e321c357e74bb3d5c29b8b3 /src/qml
parent547b4d2c2d9424fdcc694e291fe543a4f52cb684 (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.cpp19
-rw-r--r--src/qml/qml/qqml.h56
-rw-r--r--src/qml/qml/qqmlmetatype.cpp54
-rw-r--r--src/qml/qml/qqmlprivate.h24
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
};