diff options
Diffstat (limited to 'src/qml/qml/qqmlmetatype_p.h')
-rw-r--r-- | src/qml/qml/qqmlmetatype_p.h | 179 |
1 files changed, 90 insertions, 89 deletions
diff --git a/src/qml/qml/qqmlmetatype_p.h b/src/qml/qml/qqmlmetatype_p.h index c19dd8aff7..f4870d9db1 100644 --- a/src/qml/qml/qqmlmetatype_p.h +++ b/src/qml/qml/qqmlmetatype_p.h @@ -28,88 +28,89 @@ class QRecursiveMutex; class QQmlError; class QQmlValueType; -namespace QV4 { class ExecutableCompilationUnit; } +namespace QV4 { +namespace CompiledData { +struct CompilationUnit; +} +} -struct CompositeMetaTypeIds +class Q_QML_EXPORT QQmlMetaType { -private: - int *refCount = nullptr; - void deref(); - void ref() - { - Q_ASSERT(refCount); - ++*refCount; - } -public: - CompositeMetaTypeIds() = default; - CompositeMetaTypeIds(QMetaType id, QMetaType listId) : id(id), listId(listId) {} - CompositeMetaTypeIds(const CompositeMetaTypeIds &other) - : refCount(other.refCount), id(other.id), listId(other.listId) - { - if (refCount) - ref(); - } - CompositeMetaTypeIds(CompositeMetaTypeIds &&other) - : refCount(other.refCount), id(other.id), listId(other.listId) - { - other.refCount = nullptr; - } - CompositeMetaTypeIds &operator=(const CompositeMetaTypeIds &other) - { - if (refCount) - deref(); - refCount = other.refCount; - id = other.id; - listId = other.listId; - if (refCount) - ref(); - return *this; - } - CompositeMetaTypeIds &operator=(CompositeMetaTypeIds &&other) - { - if (refCount) - deref(); - refCount = other.refCount; - id = other.id; - listId = other.listId; - other.refCount = nullptr; - return *this; - } - ~CompositeMetaTypeIds(); - static CompositeMetaTypeIds fromCompositeName(const QByteArray &name); -public: - QMetaType id; - QMetaType listId; - bool isValid() const { return id.isValid() && listId.isValid(); } -}; - -class Q_QML_PRIVATE_EXPORT QQmlMetaType -{ - friend struct CompositeMetaTypeIds; friend class QQmlDesignerMetaObject; - static CompositeMetaTypeIds registerInternalCompositeType(const QByteArray &className); - static void unregisterInternalCompositeType(const CompositeMetaTypeIds &typeIds); - public: + enum class RegistrationResult { Success, Failure, NoRegistrationFunction }; + static QUrl inlineComponentUrl(const QUrl &baseUrl, const QString &name) + { + QUrl icUrl = baseUrl; + icUrl.setFragment(name); + return icUrl; + } + + static bool equalBaseUrls(const QUrl &aUrl, const QUrl &bUrl) + { + // Everything but fragment has to match + return aUrl.port() == bUrl.port() + && aUrl.scheme() == bUrl.scheme() + && aUrl.userName() == bUrl.userName() + && aUrl.password() == bUrl.password() + && aUrl.host() == bUrl.host() + && aUrl.path() == bUrl.path() + && aUrl.query() == bUrl.query(); + } + + enum CompositeTypeLookupMode { + NonSingleton, + Singleton, + }; + + static QQmlType findCompositeType( + const QUrl &url, + const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit, + CompositeTypeLookupMode mode = NonSingleton); + static QQmlType findInlineComponentType( + const QUrl &url, + const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit); + static QQmlType findInlineComponentType( + const QUrl &baseUrl, const QString &name, + const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit) + { + return findInlineComponentType(inlineComponentUrl(baseUrl, name), compilationUnit); + } + + static void unregisterInternalCompositeType(QMetaType metaType, QMetaType listMetaType); static QQmlType registerType(const QQmlPrivate::RegisterType &type); static QQmlType registerInterface(const QQmlPrivate::RegisterInterface &type); - static QQmlType registerSingletonType(const QQmlPrivate::RegisterSingletonType &type); - static QQmlType registerCompositeSingletonType(const QQmlPrivate::RegisterCompositeSingletonType &type); + static QQmlType registerSingletonType( + const QQmlPrivate::RegisterSingletonType &type, + const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo); + static QQmlType registerCompositeSingletonType( + const QQmlPrivate::RegisterCompositeSingletonType &type, + const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo); static QQmlType registerCompositeType(const QQmlPrivate::RegisterCompositeType &type); static RegistrationResult registerPluginTypes(QObject *instance, const QString &basePath, const QString &uri, const QString &typeNamespace, QTypeRevision version, QList<QQmlError> *errors); + static QQmlType typeForUrl(const QString &urlString, const QHashedStringRef& typeName, - bool isCompositeSingleton, QList<QQmlError> *errors, + CompositeTypeLookupMode mode, QList<QQmlError> *errors, QTypeRevision version = QTypeRevision()); + static QQmlType fetchOrCreateInlineComponentTypeForUrl(const QUrl &url); + static QQmlType inlineComponentType(const QQmlType &outerType, const QString &name) + { + return outerType.isComposite() + ? fetchOrCreateInlineComponentTypeForUrl( + inlineComponentUrl(outerType.sourceUrl(), name)) + : QQmlType(); + } + static void unregisterType(int type); static void registerMetaObjectForType(const QMetaObject *metaobject, QQmlTypePrivate *type); @@ -197,8 +198,6 @@ public: static void prependCachedUnitLookupFunction(QQmlPrivate::QmlUnitCacheLookupFunction handler); static void removeCachedUnitLookupFunction(QQmlPrivate::QmlUnitCacheLookupFunction handler); - static QRecursiveMutex *typeRegistrationLock(); - static QString prettyTypeName(const QObject *object); template <typename QQmlTypeContainer> @@ -213,6 +212,21 @@ public: } } + template <typename InlineComponentContainer> + static void removeFromInlineComponents( + InlineComponentContainer &container, const QQmlTypePrivate *reference) + { + const QUrl referenceUrl = QQmlType(reference).sourceUrl(); + for (auto it = container.begin(), end = container.end(); it != end;) { + if (equalBaseUrls(it.key(), referenceUrl)) + it = container.erase(it); + else + ++it; + } + } + + static void registerTypeAlias(int typeId, const QString &name); + static int registerAutoParentFunction(const QQmlPrivate::RegisterAutoParent &autoparent); static void unregisterAutoParentFunction(const QQmlPrivate::AutoParentFunction &function); @@ -243,31 +257,18 @@ public: static bool isValueType(QMetaType type); static QQmlValueType *valueType(QMetaType metaType); static const QMetaObject *metaObjectForValueType(QMetaType type); - static const QMetaObject *metaObjectForValueType(const QQmlType &qmlType) - { - // Prefer the extension meta object, if any. - // Extensions allow registration of non-gadget value types. - if (const QMetaObject *extensionMetaObject = qmlType.extensionMetaObject()) { - // This may be a namespace even if the original metaType isn't. - // You can do such things with QML_FOREIGN declarations. - if (extensionMetaObject->metaType().flags() & QMetaType::IsGadget) - return extensionMetaObject; - } - - if (const QMetaObject *qmlTypeMetaObject = qmlType.metaObject()) { - // This may be a namespace even if the original metaType isn't. - // You can do such things with QML_FOREIGN declarations. - if (qmlTypeMetaObject->metaType().flags() & QMetaType::IsGadget) - return qmlTypeMetaObject; - } - - return nullptr; - } static QQmlPropertyCache::ConstPtr findPropertyCacheInCompositeTypes(QMetaType t); - static void registerInternalCompositeType(QV4::ExecutableCompilationUnit *compilationUnit); - static void unregisterInternalCompositeType(QV4::ExecutableCompilationUnit *compilationUnit); - static QV4::ExecutableCompilationUnit *obtainExecutableCompilationUnit(QMetaType type); + static void registerInternalCompositeType( + const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit); + static void unregisterInternalCompositeType( + const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit); + static int countInternalCompositeTypeSelfReferences( + const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit); + static QQmlRefPointer<QV4::CompiledData::CompilationUnit> obtainCompilationUnit( + QMetaType type); + static QQmlRefPointer<QV4::CompiledData::CompilationUnit> obtainCompilationUnit( + const QUrl &url); }; Q_DECLARE_TYPEINFO(QQmlMetaType, Q_RELOCATABLE_TYPE); @@ -287,7 +288,7 @@ struct QQmlMetaTypeInterface : QtPrivate::QMetaTypeInterface const QByteArray name; QQmlMetaTypeInterface(const QByteArray &name) : QMetaTypeInterface { - /*.revision=*/ 0, + /*.revision=*/ QMetaTypeInterface::CurrentRevision, /*.alignment=*/ alignof(QObject *), /*.size=*/ sizeof(QObject *), /*.flags=*/ QtPrivate::QMetaTypeTypeFlags<QObject *>::Flags, @@ -322,7 +323,7 @@ struct QQmlListMetaTypeInterface : QtPrivate::QMetaTypeInterface const QtPrivate::QMetaTypeInterface *valueType; QQmlListMetaTypeInterface(const QByteArray &name, const QtPrivate::QMetaTypeInterface *valueType) : QMetaTypeInterface { - /*.revision=*/ 0, + /*.revision=*/ QMetaTypeInterface::CurrentRevision, /*.alignment=*/ alignof(QQmlListProperty<QObject>), /*.size=*/ sizeof(QQmlListProperty<QObject>), /*.flags=*/ QtPrivate::QMetaTypeTypeFlags<QQmlListProperty<QObject>>::Flags, |