diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-03-21 20:42:38 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-03-21 20:42:47 +0100 |
commit | 6767114285db9d0e16dc278d08f231e8561546b4 (patch) | |
tree | 0945902a2242fd7ec0a1f7fd3e6acbb769e723bd /src/qml/qml/qqmltypeloader_p.h | |
parent | ee076afedccbe1d37306a7972051f84eb036d655 (diff) | |
parent | c32b109e9dea44c6775c2dbf8f164870c1dc8971 (diff) |
Merge remote-tracking branch 'origin/dev' into wip/scenegraphng
Change-Id: Ib5662d80d5b2f58cf4634c54c054545ba9df807e
Diffstat (limited to 'src/qml/qml/qqmltypeloader_p.h')
-rw-r--r-- | src/qml/qml/qqmltypeloader_p.h | 128 |
1 files changed, 80 insertions, 48 deletions
diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index f367fa6f58..987e47222d 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -55,6 +55,7 @@ #include <QtCore/qobject.h> #include <QtCore/qatomic.h> #include <QtCore/qfileinfo.h> +#include <QtCore/qcache.h> #if QT_CONFIG(qml_network) #include <QtNetwork/qnetworkreply.h> #endif @@ -83,6 +84,7 @@ class QQmlComponentPrivate; class QQmlTypeData; class QQmlTypeLoader; class QQmlExtensionInterface; +class QQmlProfiler; struct QQmlCompileError; namespace QmlIR { @@ -96,6 +98,7 @@ public: Null, // Prior to QQmlTypeLoader::load() Loading, // Prior to data being received and dataReceived() being called WaitingForDependencies, // While there are outstanding addDependency()s + ResolvingDependencies, // While resolving outstanding dependencies, to detect cycles Complete, // Finished Error // Error }; @@ -107,7 +110,7 @@ public: }; QQmlDataBlob(const QUrl &, Type, QQmlTypeLoader* manager); - virtual ~QQmlDataBlob(); + ~QQmlDataBlob() override; void startLoading(); @@ -126,6 +129,7 @@ public: qreal progress() const; QUrl url() const; + QString urlString() const; QUrl finalUrl() const; QString finalUrlString() const; @@ -136,11 +140,13 @@ public: QString readAll(QString *error) const; QDateTime sourceTimeStamp() const; bool exists() const; + bool isEmpty() const; private: friend class QQmlDataBlob; friend class QQmlTypeLoader; QString inlineSourceCode; QFileInfo fileInfo; + bool hasInlineSourceCode = false; }; protected: @@ -154,7 +160,7 @@ protected: // Callbacks made in load thread virtual void dataReceived(const SourceCodeData &) = 0; - virtual void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit*) = 0; + virtual void initializeFromCachedUnit(const QV4::CompiledData::Unit*) = 0; virtual void done(); #if QT_CONFIG(qml_network) virtual void networkError(QNetworkReply::NetworkError); @@ -204,13 +210,14 @@ private: QUrl m_url; QUrl m_finalUrl; + mutable QString m_urlString; mutable QString m_finalUrlString; // List of QQmlDataBlob's that are waiting for me to complete. QList<QQmlDataBlob *> m_waitingOnMe; // List of QQmlDataBlob's that I am waiting for to complete. - QList<QQmlDataBlob *> m_waitingFor; + QVector<QQmlRefPointer<QQmlDataBlob>> m_waitingFor; int m_redirectCount:30; bool m_inCallback:1; @@ -223,12 +230,16 @@ class QQmlTypeLoaderQmldirContent { private: friend class QQmlTypeLoader; - QQmlTypeLoaderQmldirContent(); void setContent(const QString &location, const QString &content); void setError(const QQmlError &); public: + QQmlTypeLoaderQmldirContent(); + QQmlTypeLoaderQmldirContent(const QQmlTypeLoaderQmldirContent &) = default; + QQmlTypeLoaderQmldirContent &operator=(const QQmlTypeLoaderQmldirContent &) = default; + + bool hasContent() const { return m_hasContent; } bool hasError() const; QList<QQmlError> errors(const QString &uri) const; @@ -245,9 +256,10 @@ public: private: QQmlDirParser m_parser; QString m_location; + bool m_hasContent = false; }; -class Q_AUTOTEST_EXPORT QQmlTypeLoader +class Q_QML_PRIVATE_EXPORT QQmlTypeLoader { Q_DECLARE_TR_FUNCTIONS(QQmlTypeLoader) public: @@ -257,22 +269,23 @@ public: { public: Blob(const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader); - ~Blob(); + ~Blob() override; const QQmlImports &imports() const { return m_importCache; } + void setCachedUnitStatus(QQmlMetaType::CachedUnitLookupError status) { m_cachedUnitStatus = status; } + protected: bool addImport(const QV4::CompiledData::Import *import, QList<QQmlError> *errors); bool fetchQmldir(const QUrl &url, const QV4::CompiledData::Import *import, int priority, QList<QQmlError> *errors); - bool updateQmldir(QQmlQmldirData *data, const QV4::CompiledData::Import *import, QList<QQmlError> *errors); + bool updateQmldir(const QQmlRefPointer<QQmlQmldirData> &data, const QV4::CompiledData::Import *import, QList<QQmlError> *errors); private: - virtual bool qmldirDataAvailable(QQmlQmldirData *, QList<QQmlError> *); + virtual bool qmldirDataAvailable(const QQmlRefPointer<QQmlQmldirData> &, QList<QQmlError> *); - virtual void scriptImported(QQmlScriptBlob *, const QV4::CompiledData::Location &, const QString &, const QString &) {} + virtual void scriptImported(const QQmlRefPointer<QQmlScriptBlob> &, const QV4::CompiledData::Location &, const QString &, const QString &) {} - void dependencyError(QQmlDataBlob *) override; void dependencyComplete(QQmlDataBlob *) override; protected: @@ -282,7 +295,8 @@ public: QQmlImports m_importCache; QHash<const QV4::CompiledData::Import*, int> m_unresolvedImports; - QList<QQmlQmldirData *> m_qmldirs; + QVector<QQmlRefPointer<QQmlQmldirData>> m_qmldirs; + QQmlMetaType::CachedUnitLookupError m_cachedUnitStatus = QQmlMetaType::CachedUnitLookupError::NoError; }; QQmlTypeLoader(QQmlEngine *); @@ -290,16 +304,19 @@ public: QQmlImportDatabase *importDatabase() const; - QQmlTypeData *getType(const QUrl &url, Mode mode = PreferSynchronous); - QQmlTypeData *getType(const QByteArray &, const QUrl &url, Mode mode = PreferSynchronous); + static QUrl normalize(const QUrl &unNormalizedUrl); - QQmlScriptBlob *getScript(const QUrl &); - QQmlQmldirData *getQmldir(const QUrl &); + QQmlRefPointer<QQmlTypeData> getType(const QUrl &unNormalizedUrl, Mode mode = PreferSynchronous); + QQmlRefPointer<QQmlTypeData> getType(const QByteArray &, const QUrl &url, Mode mode = PreferSynchronous); + + QQmlRefPointer<QQmlScriptBlob> getScript(const QUrl &unNormalizedUrl); + QQmlRefPointer<QQmlQmldirData> getQmldir(const QUrl &); QString absoluteFilePath(const QString &path); + bool fileExists(const QString &path, const QString &file); bool directoryExists(const QString &path); - const QQmlTypeLoaderQmldirContent *qmldirContent(const QString &filePath); + const QQmlTypeLoaderQmldirContent qmldirContent(const QString &filePath); void setQmldirContent(const QString &filePath, const QString &content); void clearCache(); @@ -308,17 +325,26 @@ public: bool isTypeLoaded(const QUrl &url) const; bool isScriptLoaded(const QUrl &url) const; - void lock(); - void unlock(); + void lock() { m_mutex.lock(); } + void unlock() { m_mutex.unlock(); } void load(QQmlDataBlob *, Mode = PreferSynchronous); void loadWithStaticData(QQmlDataBlob *, const QByteArray &, Mode = PreferSynchronous); - void loadWithCachedUnit(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit, Mode mode = PreferSynchronous); + void loadWithCachedUnit(QQmlDataBlob *blob, const QV4::CompiledData::Unit *unit, Mode mode = PreferSynchronous); QQmlEngine *engine() const; void initializeEngine(QQmlExtensionInterface *, const char *); void invalidate(); +#if !QT_CONFIG(qml_debug) + quintptr profiler() const { return 0; } + void setProfiler(quintptr) {} +#else + QQmlProfiler *profiler() const { return m_profiler.data(); } + void setProfiler(QQmlProfiler *profiler); +#endif // QT_CONFIG(qml_debug) + + private: friend class QQmlDataBlob; friend class QQmlTypeLoaderThread; @@ -330,7 +356,7 @@ private: void loadThread(QQmlDataBlob *); void loadWithStaticDataThread(QQmlDataBlob *, const QByteArray &); - void loadWithCachedUnitThread(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit); + void loadWithCachedUnitThread(QQmlDataBlob *blob, const QV4::CompiledData::Unit *unit); #if QT_CONFIG(qml_network) void networkReplyFinished(QNetworkReply *); void networkReplyProgress(QNetworkReply *, qint64, qint64); @@ -341,7 +367,7 @@ private: void setData(QQmlDataBlob *, const QByteArray &); void setData(QQmlDataBlob *, const QString &fileName); void setData(QQmlDataBlob *, const QQmlDataBlob::SourceCodeData &); - void setCachedUnit(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit); + void setCachedUnit(QQmlDataBlob *blob, const QV4::CompiledData::Unit *unit); template<typename T> struct TypedCallback @@ -362,12 +388,17 @@ private: typedef QHash<QUrl, QQmlTypeData *> TypeCache; typedef QHash<QUrl, QQmlScriptBlob *> ScriptCache; typedef QHash<QUrl, QQmlQmldirData *> QmldirCache; - typedef QStringHash<bool> StringSet; - typedef QStringHash<StringSet*> ImportDirCache; + typedef QCache<QString, QCache<QString, bool> > ImportDirCache; typedef QStringHash<QQmlTypeLoaderQmldirContent *> ImportQmlDirCache; QQmlEngine *m_engine; QQmlTypeLoaderThread *m_thread; + QMutex &m_mutex; + +#if QT_CONFIG(qml_debug) + QScopedPointer<QQmlProfiler> m_profiler; +#endif + #if QT_CONFIG(qml_network) NetworkReplies m_networkReplies; #endif @@ -393,13 +424,13 @@ class Q_AUTOTEST_EXPORT QQmlTypeData : public QQmlTypeLoader::Blob public: struct TypeReference { - TypeReference() : type(0), majorVersion(0), minorVersion(0), typeData(0), needsCreation(true) {} + TypeReference() : majorVersion(0), minorVersion(0), needsCreation(true) {} QV4::CompiledData::Location location; - QQmlType *type; + QQmlType type; int majorVersion; int minorVersion; - QQmlTypeData *typeData; + QQmlRefPointer<QQmlTypeData> typeData; QString prefix; // used by CompositeSingleton types QString qualifiedName() const; bool needsCreation; @@ -407,11 +438,9 @@ public: struct ScriptReference { - ScriptReference() : script(0) {} - QV4::CompiledData::Location location; QString qualifier; - QQmlScriptBlob *script; + QQmlRefPointer<QQmlScriptBlob> script; }; private: @@ -420,7 +449,7 @@ private: QQmlTypeData(const QUrl &, QQmlTypeLoader *); public: - ~QQmlTypeData(); + ~QQmlTypeData() override; const QList<ScriptReference> &resolvedScripts() const; @@ -439,7 +468,7 @@ protected: void done() override; void completed() override; void dataReceived(const SourceCodeData &) override; - void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit) override; + void initializeFromCachedUnit(const QV4::CompiledData::Unit *unit) override; void allDependenciesDone() override; void downloadProgressChanged(qreal) override; @@ -456,12 +485,16 @@ private: QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache ) const; void compile(const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache, - const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypeCache, const QV4::CompiledData::DependentTypesHasher &dependencyHasher); + QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache, + const QV4::CompiledData::DependentTypesHasher &dependencyHasher); void createTypeAndPropertyCaches(const QQmlRefPointer<QQmlTypeNameCache> &typeNameCache, const QV4::CompiledData::ResolvedTypeReferenceMap &resolvedTypeCache); - bool resolveType(const QString &typeName, int &majorVersion, int &minorVersion, TypeReference &ref, int lineNumber = -1, int columnNumber = -1, bool reportErrors = true); + bool resolveType(const QString &typeName, int &majorVersion, int &minorVersion, + TypeReference &ref, int lineNumber = -1, int columnNumber = -1, + bool reportErrors = true, + QQmlType::RegistrationType registrationType = QQmlType::AnyRegistrationType); - void scriptImported(QQmlScriptBlob *blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace) override; + void scriptImported(const QQmlRefPointer<QQmlScriptBlob> &blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace) override; SourceCodeData m_backupSourceCode; // used when cache verification fails. @@ -502,15 +535,15 @@ private: QQmlScriptData(); public: - ~QQmlScriptData(); - QUrl url; QString urlString; QQmlTypeNameCache *typeNameCache; - QList<QQmlScriptBlob *> scripts; + QVector<QQmlRefPointer<QQmlScriptBlob>> scripts; QV4::ReturnedValue scriptValueForContext(QQmlContextData *parentCtxt); + QQmlRefPointer<QV4::CompiledData::CompilationUnit> compilationUnit() const { return m_precompiledScript; } + protected: void clear() override; // From QQmlCleanup @@ -518,10 +551,10 @@ private: friend class QQmlScriptBlob; void initialize(QQmlEngine *); + QQmlContextData *qmlContextDataForContext(QQmlContextData *parentQmlContextData); bool m_loaded; QQmlRefPointer<QV4::CompiledData::CompilationUnit> m_precompiledScript; - QV4::Script *m_program; QV4::PersistentValue m_value; }; @@ -533,33 +566,32 @@ private: QQmlScriptBlob(const QUrl &, QQmlTypeLoader *); public: - ~QQmlScriptBlob(); + ~QQmlScriptBlob() override; struct ScriptReference { - ScriptReference() : script(0) {} - QV4::CompiledData::Location location; QString qualifier; QString nameSpace; - QQmlScriptBlob *script; + QQmlRefPointer<QQmlScriptBlob> script; }; - QQmlScriptData *scriptData() const; + QQmlRefPointer<QQmlScriptData> scriptData() const; protected: void dataReceived(const SourceCodeData &) override; - void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit) override; + void initializeFromCachedUnit(const QV4::CompiledData::Unit *unit) override; void done() override; QString stringAt(int index) const override; private: - void scriptImported(QQmlScriptBlob *blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace) override; - void initializeFromCompilationUnit(QV4::CompiledData::CompilationUnit *unit); + void scriptImported(const QQmlRefPointer<QQmlScriptBlob> &blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace) override; + void initializeFromCompilationUnit(const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &unit); QList<ScriptReference> m_scripts; - QQmlScriptData *m_scriptData; + QQmlRefPointer<QQmlScriptData> m_scriptData; + const bool m_isModule; }; class Q_AUTOTEST_EXPORT QQmlQmldirData : public QQmlTypeLoader::Blob @@ -580,7 +612,7 @@ public: protected: void dataReceived(const SourceCodeData &) override; - void initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit*) override; + void initializeFromCachedUnit(const QV4::CompiledData::Unit *) override; private: QString m_content; |