diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2018-04-23 14:42:43 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2018-04-26 09:56:43 +0000 |
commit | 2ce01aa8ca69b882e4186625667d191f3428fc3a (patch) | |
tree | 663f1d0dd8a332f357f1e0c40e07eebb52bb45c7 /src | |
parent | 1a3447a0405831fa5502247f9eaff48afdfe0dea (diff) |
Clean up manual reference counting of QQmlScriptBlob
Replace manual reference counting for loaded scripts with QQmlRefPointer
use.
Change-Id: I5d765a3bb73a04b3a894a04e066d4d73220dafe5
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 30 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader_p.h | 18 |
2 files changed, 20 insertions, 28 deletions
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index c49c2b3036..57acb1f400 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -1375,8 +1375,8 @@ bool QQmlTypeLoader::Blob::updateQmldir(QQmlQmldirData *data, const QV4::Compile const auto qmldirScripts = qmldir.scripts(); for (const QQmlDirParser::Script &script : qmldirScripts) { QUrl scriptUrl = libraryUrl.resolved(QUrl(script.fileName)); - QQmlScriptBlob *blob = typeLoader()->getScript(scriptUrl); - addDependency(blob); + QQmlRefPointer<QQmlScriptBlob> blob = typeLoader()->getScript(scriptUrl); + addDependency(blob.data()); scriptImported(blob, import->location, script.nameSpace, importQualifier); } @@ -1395,8 +1395,8 @@ bool QQmlTypeLoader::Blob::addImport(const QV4::CompiledData::Import *import, QL const QString &importQualifier = stringAt(import->qualifierIndex); if (import->type == QV4::CompiledData::Import::ImportScript) { QUrl scriptUrl = finalUrl().resolved(QUrl(importUri)); - QQmlScriptBlob *blob = typeLoader()->getScript(scriptUrl); - addDependency(blob); + QQmlRefPointer<QQmlScriptBlob> blob = typeLoader()->getScript(scriptUrl); + addDependency(blob.data()); scriptImported(blob, import->location, importQualifier, QString()); } else if (import->type == QV4::CompiledData::Import::ImportLibrary) { @@ -1423,8 +1423,8 @@ bool QQmlTypeLoader::Blob::addImport(const QV4::CompiledData::Import *import, QL const auto qmldirScripts = qmldir.scripts(); for (const QQmlDirParser::Script &script : qmldirScripts) { QUrl scriptUrl = libraryUrl.resolved(QUrl(script.fileName)); - QQmlScriptBlob *blob = typeLoader()->getScript(scriptUrl); - addDependency(blob); + QQmlRefPointer<QQmlScriptBlob> blob = typeLoader()->getScript(scriptUrl); + addDependency(blob.data()); scriptImported(blob, import->location, script.nameSpace, importQualifier); } @@ -1714,7 +1714,7 @@ QQmlRefPointer<QQmlTypeData> QQmlTypeLoader::getType(const QByteArray &data, con /*! Return a QQmlScriptBlob for \a url. The QQmlScriptData may be cached. */ -QQmlScriptBlob *QQmlTypeLoader::getScript(const QUrl &url) +QQmlRefPointer<QQmlScriptBlob> QQmlTypeLoader::getScript(const QUrl &url) { Q_ASSERT(!url.isRelative() && (QQmlFile::urlToLocalFileOrQrc(url).isEmpty() || @@ -1737,8 +1737,6 @@ QQmlScriptBlob *QQmlTypeLoader::getScript(const QUrl &url) } } - scriptBlob->addref(); - return scriptBlob; } @@ -2064,8 +2062,7 @@ QQmlTypeData::QQmlTypeData(const QUrl &url, QQmlTypeLoader *manager) QQmlTypeData::~QQmlTypeData() { - for (int ii = 0; ii < m_scripts.count(); ++ii) - m_scripts.at(ii).script->release(); + m_scripts.clear(); m_compositeSingletons.clear(); m_resolvedTypes.clear(); } @@ -2621,8 +2618,8 @@ void QQmlTypeData::resolveTypes() // Add any imported scripts to our resolved set const auto resolvedScripts = m_importCache.resolvedScripts(); for (const QQmlImports::ScriptReference &script : resolvedScripts) { - QQmlScriptBlob *blob = typeLoader()->getScript(script.location); - addDependency(blob); + QQmlRefPointer<QQmlScriptBlob> blob = typeLoader()->getScript(script.location); + addDependency(blob.data()); ScriptReference ref; //ref.location = ... @@ -2817,7 +2814,7 @@ bool QQmlTypeData::resolveType(const QString &typeName, int &majorVersion, int & return true; } -void QQmlTypeData::scriptImported(QQmlScriptBlob *blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &/*nameSpace*/) +void QQmlTypeData::scriptImported(const QQmlRefPointer<QQmlScriptBlob> &blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &/*nameSpace*/) { ScriptReference ref; ref.script = blob; @@ -2943,8 +2940,6 @@ void QQmlScriptData::clear() typeNameCache = nullptr; } - for (int ii = 0; ii < scripts.count(); ++ii) - scripts.at(ii)->release(); scripts.clear(); // An addref() was made when the QQmlCleanup was added to the engine. @@ -3082,6 +3077,7 @@ void QQmlScriptBlob::done() } m_scriptData->typeNameCache->add(script.qualifier, scriptIndex, script.nameSpace); } + m_scripts.clear(); m_importCache.populateCache(m_scriptData->typeNameCache); } @@ -3091,7 +3087,7 @@ QString QQmlScriptBlob::stringAt(int index) const return m_scriptData->m_precompiledScript->data->stringAt(index); } -void QQmlScriptBlob::scriptImported(QQmlScriptBlob *blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace) +void QQmlScriptBlob::scriptImported(const QQmlRefPointer<QQmlScriptBlob> &blob, const QV4::CompiledData::Location &location, const QString &qualifier, const QString &nameSpace) { ScriptReference ref; ref.script = blob; diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index 0494034b3e..1d78364548 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -284,7 +284,7 @@ public: private: virtual bool qmldirDataAvailable(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; @@ -308,7 +308,7 @@ public: QQmlRefPointer<QQmlTypeData> getType(const QUrl &url, Mode mode = PreferSynchronous); QQmlRefPointer<QQmlTypeData> getType(const QByteArray &, const QUrl &url, Mode mode = PreferSynchronous); - QQmlScriptBlob *getScript(const QUrl &); + QQmlRefPointer<QQmlScriptBlob> getScript(const QUrl &); QQmlQmldirData *getQmldir(const QUrl &); QString absoluteFilePath(const QString &path); @@ -436,11 +436,9 @@ public: struct ScriptReference { - ScriptReference() : script(nullptr) {} - QV4::CompiledData::Location location; QString qualifier; - QQmlScriptBlob *script; + QQmlRefPointer<QQmlScriptBlob> script; }; private: @@ -493,7 +491,7 @@ private: 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. @@ -539,7 +537,7 @@ public: QUrl url; QString urlString; QQmlTypeNameCache *typeNameCache; - QList<QQmlScriptBlob *> scripts; + QVector<QQmlRefPointer<QQmlScriptBlob>> scripts; QV4::ReturnedValue scriptValueForContext(QQmlContextData *parentCtxt); @@ -569,12 +567,10 @@ public: struct ScriptReference { - ScriptReference() : script(nullptr) {} - QV4::CompiledData::Location location; QString qualifier; QString nameSpace; - QQmlScriptBlob *script; + QQmlRefPointer<QQmlScriptBlob> script; }; QQmlScriptData *scriptData() const; @@ -587,7 +583,7 @@ protected: QString stringAt(int index) const override; private: - 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; void initializeFromCompilationUnit(const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &unit); QList<ScriptReference> m_scripts; |