diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-02-18 14:24:45 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-02-18 14:40:10 +0000 |
commit | 06ec6340d0eff763e52135afabc13662b3892c43 (patch) | |
tree | 839663e808cb49633a35a453beb85f4b49801b96 /src/qml/compiler/qqmltypecompiler_p.h | |
parent | 2131ec383b588e2160cb72247e61f7eab71cc0b1 (diff) |
Avoid unnecessary re-generation qml cache files in some circumstances
The map of name IDs to resolved types so far is copied several times
during compilation and different compile passes see different copies of it.
Compile passes may add things to the map, and if they do that on copies
that are inaccessible to other code, we get nondeterministic results.
Furthermore all the copies and pointers are confusing and inefficient.
Fixes: QTBUG-69340
Change-Id: I43ad3cbeeec34f90e05570eddc901fe8aa64c709
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/compiler/qqmltypecompiler_p.h')
-rw-r--r-- | src/qml/compiler/qqmltypecompiler_p.h | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h index ffe04eb090..a49b97453f 100644 --- a/src/qml/compiler/qqmltypecompiler_p.h +++ b/src/qml/compiler/qqmltypecompiler_p.h @@ -79,7 +79,9 @@ struct QQmlTypeCompiler { Q_DECLARE_TR_FUNCTIONS(QQmlTypeCompiler) public: - QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlTypeData *typeData, QmlIR::Document *document, const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache, const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypeCache, + QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlTypeData *typeData, QmlIR::Document *document, + const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache, + QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache, const QV4::CompiledData::DependentTypesHasher &dependencyHasher); // --- interface used by QQmlPropertyCacheCreator @@ -89,7 +91,7 @@ public: QString stringAt(int idx) const; QmlIR::PoolList<QmlIR::Function>::Iterator objectFunctionsBegin(const QmlIR::Object *object) const { return object->functionsBegin(); } QmlIR::PoolList<QmlIR::Function>::Iterator objectFunctionsEnd(const QmlIR::Object *object) const { return object->functionsEnd(); } - QV4::CompiledData::ResolvedTypeReferenceMap resolvedTypes; + QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypes = nullptr; // --- QQmlRefPointer<QV4::CompiledData::CompilationUnit> compile(); @@ -124,6 +126,11 @@ public: void addImport(const QString &module, const QString &qualifier, int majorVersion, int minorVersion); + QV4::CompiledData::ResolvedTypeReference *resolvedType(int id) const + { + return resolvedTypes->value(id); + } + private: QList<QQmlError> errors; QQmlEnginePrivate *engine; @@ -150,6 +157,14 @@ protected: void recordError(const QQmlCompileError &error) { compiler->recordError(error); } + QV4::CompiledData::ResolvedTypeReference *resolvedType(int id) const + { return compiler->resolvedType(id); } + bool containsResolvedType(int id) const + { return compiler->resolvedTypes->contains(id); } + QV4::CompiledData::ResolvedTypeReferenceMap::iterator insertResolvedType( + int id, QV4::CompiledData::ResolvedTypeReference *value) + { return compiler->resolvedTypes->insert(id, value); } + QQmlTypeCompiler *compiler; }; @@ -172,7 +187,6 @@ private: const QVector<QmlIR::Object*> &qmlObjects; const QQmlImports *imports; const QHash<int, QQmlCustomParser*> &customParsers; - const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypes; const QSet<QString> &illegalNames; const QQmlPropertyCacheVector * const propertyCaches; }; @@ -203,7 +217,6 @@ private: const QVector<QmlIR::Object*> &qmlObjects; const QQmlPropertyCacheVector * const propertyCaches; const QQmlImports *imports; - QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypes; }; class QQmlCustomParserScriptIndexer: public QQmlCompilePass @@ -278,7 +291,6 @@ protected: QMap<int, int> _idToObjectIndex; QVector<int> _objectsWithAliases; - QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypes; QQmlPropertyCacheVector propertyCaches; }; @@ -311,7 +323,6 @@ private: bool compileComponent(int componentRoot); bool compileJavaScriptCodeInObjectsRecursively(int objectIndex, int scopeObjectIndex); - const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypes; const QHash<int, QQmlCustomParser*> &customParsers; const QVector<QmlIR::Object*> &qmlObjects; const QQmlPropertyCacheVector * const propertyCaches; |