From fa53d4e35433cc59e99b24f16f18c713683c1a80 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 28 Jul 2016 17:40:29 +0200 Subject: Cleanup: Move ResolvedTypeReference(Map) one scope up The class is a candidate for further functionality, it doesn't have to be nested in CompilationUnit. Change-Id: I100553160f5ae34f66b9f8ff5df9f636da2ffb67 Reviewed-by: Ulf Hermann --- src/qml/compiler/qqmlpropertyvalidator_p.h | 2 +- src/qml/compiler/qqmltypecompiler.cpp | 6 ++-- src/qml/compiler/qqmltypecompiler_p.h | 12 +++---- src/qml/compiler/qv4compileddata.cpp | 6 ++-- src/qml/compiler/qv4compileddata_p.h | 56 ++++++++++++++++-------------- src/qml/qml/qqmlobjectcreator.cpp | 4 +-- src/qml/qml/qqmlobjectcreator_p.h | 2 +- src/qml/qml/qqmltypeloader.cpp | 15 ++++---- src/qml/qml/qqmltypeloader_p.h | 5 ++- 9 files changed, 59 insertions(+), 49 deletions(-) (limited to 'src/qml') diff --git a/src/qml/compiler/qqmlpropertyvalidator_p.h b/src/qml/compiler/qqmlpropertyvalidator_p.h index 1cbb370068..d0bd314461 100644 --- a/src/qml/compiler/qqmlpropertyvalidator_p.h +++ b/src/qml/compiler/qqmlpropertyvalidator_p.h @@ -76,7 +76,7 @@ private: QQmlEnginePrivate *enginePrivate; const QQmlImports &imports; const QV4::CompiledData::Unit *qmlUnit; - const QHash &resolvedTypes; + const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypes; const QQmlPropertyCacheVector &propertyCaches; QVector * const bindingPropertyDataPerObject; diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index bb4d603f68..a0b219e28e 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -56,7 +56,9 @@ QT_BEGIN_NAMESPACE -QQmlTypeCompiler::QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlTypeData *typeData, QmlIR::Document *parsedQML, const QQmlRefPointer &importCache, const QV4::CompiledData::CompilationUnit::ResolvedTypeReferenceMap &resolvedTypeCache) +QQmlTypeCompiler::QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlTypeData *typeData, + QmlIR::Document *parsedQML, const QQmlRefPointer &importCache, + const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypeCache) : resolvedTypes(resolvedTypeCache) , engine(engine) , typeData(typeData) @@ -837,7 +839,7 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QmlI syntheticComponent->flags |= QV4::CompiledData::Object::IsComponent; if (!resolvedTypes->contains(syntheticComponent->inheritedTypeNameIndex)) { - auto typeRef = new QV4::CompiledData::CompilationUnit::ResolvedTypeReference; + auto typeRef = new QV4::CompiledData::ResolvedTypeReference; typeRef->type = componentType; typeRef->majorVersion = componentType->majorVersion(); typeRef->minorVersion = componentType->minorVersion(); diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h index 9f1a09b35c..6ad6ad8557 100644 --- a/src/qml/compiler/qqmltypecompiler_p.h +++ b/src/qml/compiler/qqmltypecompiler_p.h @@ -89,7 +89,7 @@ struct QQmlTypeCompiler { Q_DECLARE_TR_FUNCTIONS(QQmlTypeCompiler) public: - QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlTypeData *typeData, QmlIR::Document *document, const QQmlRefPointer &importCache, const QV4::CompiledData::CompilationUnit::ResolvedTypeReferenceMap &resolvedTypeCache); + QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlTypeData *typeData, QmlIR::Document *document, const QQmlRefPointer &importCache, const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypeCache); // --- interface used by QQmlPropertyCacheCreator typedef QmlIR::Object CompiledObject; @@ -98,7 +98,7 @@ public: QString stringAt(int idx) const; QmlIR::PoolList::Iterator objectFunctionsBegin(const QmlIR::Object *object) const { return object->functionsBegin(); } QmlIR::PoolList::Iterator objectFunctionsEnd(const QmlIR::Object *object) const { return object->functionsEnd(); } - QV4::CompiledData::CompilationUnit::ResolvedTypeReferenceMap resolvedTypes; + QV4::CompiledData::ResolvedTypeReferenceMap resolvedTypes; // --- QV4::CompiledData::CompilationUnit *compile(); @@ -182,7 +182,7 @@ private: const QVector &qmlObjects; const QQmlImports *imports; const QHash &customParsers; - const QHash &resolvedTypes; + const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypes; const QSet &illegalNames; const QQmlPropertyCacheVector * const propertyCaches; }; @@ -213,7 +213,7 @@ private: const QVector &qmlObjects; const QQmlPropertyCacheVector * const propertyCaches; const QQmlImports *imports; - QHash *resolvedTypes; + QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypes; }; class QQmlCustomParserScriptIndexer: public QQmlCompilePass @@ -288,7 +288,7 @@ protected: QHash _idToObjectIndex; QVector _objectsWithAliases; - QHash *resolvedTypes; + QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypes; QQmlPropertyCacheVector propertyCaches; }; @@ -321,7 +321,7 @@ private: bool compileComponent(int componentRoot); bool compileJavaScriptCodeInObjectsRecursively(int objectIndex, int scopeObjectIndex); - const QHash &resolvedTypes; + const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypes; const QHash &customParsers; const QVector &qmlObjects; const QQmlPropertyCacheVector * const propertyCaches; diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index 965924262d..2aab1743cc 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -535,7 +535,7 @@ QString Binding::valueAsScriptString(const Unit *unit) const /*! Returns the property cache, if one alread exists. The cache is not referenced. */ -QQmlPropertyCache *CompilationUnit::ResolvedTypeReference::propertyCache() const +QQmlPropertyCache *ResolvedTypeReference::propertyCache() const { if (type) return typePropertyCache; @@ -546,7 +546,7 @@ QQmlPropertyCache *CompilationUnit::ResolvedTypeReference::propertyCache() const /*! Returns the property cache, creating one if it doesn't already exist. The cache is not referenced. */ -QQmlPropertyCache *CompilationUnit::ResolvedTypeReference::createPropertyCache(QQmlEngine *engine) +QQmlPropertyCache *ResolvedTypeReference::createPropertyCache(QQmlEngine *engine) { if (typePropertyCache) { return typePropertyCache; @@ -568,7 +568,7 @@ bool qtTypeInherits(const QMetaObject *mo) { return false; } -void CompilationUnit::ResolvedTypeReference::doDynamicTypeCheck() +void ResolvedTypeReference::doDynamicTypeCheck() { const QMetaObject *mo = 0; if (typePropertyCache) diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 4153259760..82e303f27d 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -762,6 +762,35 @@ struct TypeReferenceMap : QHash } }; +#ifndef V4_BOOTSTRAP +struct ResolvedTypeReference +{ + ResolvedTypeReference() + : type(0) + , majorVersion(0) + , minorVersion(0) + , isFullyDynamicType(false) + {} + + QQmlType *type; + QQmlRefPointer typePropertyCache; + QQmlRefPointer compilationUnit; + + int majorVersion; + int minorVersion; + // Types such as QQmlPropertyMap can add properties dynamically at run-time and + // therefore cannot have a property cache installed when instantiated. + bool isFullyDynamicType; + + QQmlPropertyCache *propertyCache() const; + QQmlPropertyCache *createPropertyCache(QQmlEngine *); + + void doDynamicTypeCheck(); +}; +// map from name index +typedef QHash ResolvedTypeReferenceMap; +#endif + // index is per-object binding index typedef QVector BindingPropertyData; @@ -823,33 +852,6 @@ struct Q_QML_PRIVATE_EXPORT CompilationUnit : public QQmlRefCount int totalObjectCount; // Number of objects explicitly instantiated QVector dependentScripts; - - struct ResolvedTypeReference - { - ResolvedTypeReference() - : type(0) - , majorVersion(0) - , minorVersion(0) - , isFullyDynamicType(false) - {} - - QQmlType *type; - QQmlRefPointer typePropertyCache; - QQmlRefPointer compilationUnit; - - int majorVersion; - int minorVersion; - // Types such as QQmlPropertyMap can add properties dynamically at run-time and - // therefore cannot have a property cache installed when instantiated. - bool isFullyDynamicType; - - QQmlPropertyCache *propertyCache() const; - QQmlPropertyCache *createPropertyCache(QQmlEngine *); - - void doDynamicTypeCheck(); - }; - // map from name index - typedef QHash ResolvedTypeReferenceMap; ResolvedTypeReferenceMap resolvedTypes; int metaTypeId; diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index a38d18acfb..f2b3276778 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -675,7 +675,7 @@ bool QQmlObjectCreator::setPropertyBinding(const QQmlPropertyData *property, con { if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) { Q_ASSERT(stringAt(qmlUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex).isEmpty()); - QV4::CompiledData::CompilationUnit::ResolvedTypeReference *tr = resolvedTypes.value(binding->propertyNameIndex); + QV4::CompiledData::ResolvedTypeReference *tr = resolvedTypes.value(binding->propertyNameIndex); Q_ASSERT(tr); QQmlType *attachedType = tr->type; if (!attachedType) { @@ -1008,7 +1008,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo instance = component; ddata = QQmlData::get(instance, /*create*/true); } else { - QV4::CompiledData::CompilationUnit::ResolvedTypeReference *typeRef = resolvedTypes.value(obj->inheritedTypeNameIndex); + QV4::CompiledData::ResolvedTypeReference *typeRef = resolvedTypes.value(obj->inheritedTypeNameIndex); Q_ASSERT(typeRef); installPropertyCache = !typeRef->isFullyDynamicType; QQmlType *type = typeRef->type; diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h index 4aa3f634ed..e3312f9df5 100644 --- a/src/qml/qml/qqmlobjectcreator_p.h +++ b/src/qml/qml/qqmlobjectcreator_p.h @@ -138,7 +138,7 @@ private: const QV4::CompiledData::Unit *qmlUnit; QQmlGuardedContextData parentContext; QQmlContextData *context; - const QHash &resolvedTypes; + const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypes; const QQmlPropertyCacheVector *propertyCaches; QExplicitlySharedDataPointer sharedState; bool topLevelCreator; diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 2578f44355..c54af43a6f 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -2029,7 +2029,7 @@ QQmlTypeData::~QQmlTypeData() if (QQmlTypeData *tdata = m_compositeSingletons.at(ii).typeData) tdata->release(); } - for (QHash::ConstIterator it = m_resolvedTypes.constBegin(), end = m_resolvedTypes.constEnd(); + for (auto it = m_resolvedTypes.constBegin(), end = m_resolvedTypes.constEnd(); it != end; ++it) { if (QQmlTypeData *tdata = it->typeData) tdata->release(); @@ -2189,8 +2189,8 @@ void QQmlTypeData::done() } // Check all type dependencies for errors - for (QHash::ConstIterator it = m_resolvedTypes.constBegin(), end = m_resolvedTypes.constEnd(); - it != end; ++it) { + for (auto it = m_resolvedTypes.constBegin(), end = m_resolvedTypes.constEnd(); it != end; + ++it) { const TypeReference &type = *it; Q_ASSERT(!type.typeData || type.typeData->isCompleteOrError()); if (type.typeData && type.typeData->isError()) { @@ -2469,7 +2469,7 @@ void QQmlTypeData::compile() Q_ASSERT(m_compiledData.isNull()); QQmlRefPointer importCache; - QV4::CompiledData::CompilationUnit::ResolvedTypeReferenceMap resolvedTypeCache; + QV4::CompiledData::ResolvedTypeReferenceMap resolvedTypeCache; QQmlCompileError error = buildTypeResolutionCaches(&importCache, &resolvedTypeCache); if (error.isSet()) { setError(error); @@ -2609,7 +2609,10 @@ void QQmlTypeData::resolveTypes() } } -QQmlCompileError QQmlTypeData::buildTypeResolutionCaches(QQmlRefPointer *importCache, QV4::CompiledData::CompilationUnit::ResolvedTypeReferenceMap *resolvedTypeCache) const +QQmlCompileError QQmlTypeData::buildTypeResolutionCaches( + QQmlRefPointer *importCache, + QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache + ) const { importCache->adopt(new QQmlTypeNameCache); @@ -2625,7 +2628,7 @@ QQmlCompileError QQmlTypeData::buildTypeResolutionCaches(QQmlRefPointerengine()); for (auto resolvedType = m_resolvedTypes.constBegin(), end = m_resolvedTypes.constEnd(); resolvedType != end; ++resolvedType) { - QScopedPointer ref(new QV4::CompiledData::CompilationUnit::ResolvedTypeReference); + QScopedPointer ref(new QV4::CompiledData::ResolvedTypeReference); QQmlType *qmlType = resolvedType->type; if (resolvedType->typeData) { if (resolvedType->needsCreation && qmlType->isCompositeSingleton()) { diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index 4c57306ed7..ab6b046fcf 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -444,7 +444,10 @@ private: bool tryLoadFromDiskCache(); void continueLoadFromIR(); void resolveTypes(); - QQmlCompileError buildTypeResolutionCaches(QQmlRefPointer *importCache, QV4::CompiledData::CompilationUnit::ResolvedTypeReferenceMap *resolvedTypeCache) const; + QQmlCompileError buildTypeResolutionCaches( + QQmlRefPointer *importCache, + QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache + ) const; void compile(); void rebuildTypeAndPropertyCaches(); bool resolveType(const QString &typeName, int &majorVersion, int &minorVersion, TypeReference &ref); -- cgit v1.2.3