diff options
Diffstat (limited to 'src/qml/qml/qqmltypeloader.cpp')
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 108 |
1 files changed, 61 insertions, 47 deletions
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index c62f760ee3..b164f5873c 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -395,19 +395,29 @@ QQmlEngine *QQmlTypeLoader::engine() const Call the initializeEngine() method on \a iface. Used by QQmlImportDatabase to ensure it gets called in the correct thread. */ -void QQmlTypeLoader::initializeEngine(QQmlExtensionInterface *iface, - const char *uri) +template<class Interface> +void doInitializeEngine(Interface *iface, QQmlTypeLoaderThread *thread, QQmlEngine *engine, + const char *uri) { - Q_ASSERT(m_thread->isThisThread() || engine()->thread() == QThread::currentThread()); + Q_ASSERT(thread->isThisThread() || engine->thread() == QThread::currentThread()); - if (m_thread->isThisThread()) { - m_thread->initializeEngine(iface, uri); + if (thread->isThisThread()) { + thread->initializeEngine(iface, uri); } else { - Q_ASSERT(engine()->thread() == QThread::currentThread()); - iface->initializeEngine(engine(), uri); + Q_ASSERT(engine->thread() == QThread::currentThread()); + iface->initializeEngine(engine, uri); } } +void QQmlTypeLoader::initializeEngine(QQmlEngineExtensionInterface *iface, const char *uri) +{ + doInitializeEngine(iface, m_thread, engine(), uri); +} + +void QQmlTypeLoader::initializeEngine(QQmlExtensionInterface *iface, const char *uri) +{ + doInitializeEngine(iface, m_thread, engine(), uri); +} void QQmlTypeLoader::setData(QQmlDataBlob *blob, const QByteArray &data) { @@ -588,7 +598,8 @@ bool QQmlTypeLoader::Blob::addImport(QQmlTypeLoader::Blob::PendingImportPtr impo } } else { // Is this a module? - if (QQmlMetaType::isAnyModule(import->uri)) { + if (QQmlMetaType::isAnyModule(import->uri) + || QQmlMetaType::qmlRegisterModuleTypes(import->uri, import->majorVersion)) { if (!m_importCache.addLibraryImport(importDatabase, import->uri, import->qualifier, import->majorVersion, import->minorVersion, QString(), QString(), false, errors)) return false; @@ -697,14 +708,9 @@ bool QQmlTypeLoader::Blob::isDebugging() const return typeLoader()->engine()->handle()->debugger() != nullptr; } -bool QQmlTypeLoader::Blob::diskCacheDisabled() +bool QQmlTypeLoader::Blob::diskCacheEnabled() const { - return disableDiskCache(); -} - -bool QQmlTypeLoader::Blob::diskCacheForced() -{ - return forceDiskCache(); + return (!disableDiskCache() || forceDiskCache()) && !isDebugging(); } bool QQmlTypeLoader::Blob::qmldirDataAvailable(const QQmlRefPointer<QQmlQmldirData> &data, QList<QQmlError> *errors) @@ -963,48 +969,56 @@ bool QQmlTypeLoader::fileExists(const QString &path, const QString &file) return false; Q_ASSERT(path.endsWith(QLatin1Char('/'))); + + LockHolder<QQmlTypeLoader> holder(this); + QCache<QString, bool> *fileSet = m_importDirCache.object(path); + if (fileSet) { + if (bool *value = fileSet->object(file)) + return *value; + } else if (m_importDirCache.contains(path)) { + // explicit nullptr in cache + return false; + } + + auto addToCache = [&](const QFileInfo &fileInfo) { + if (!fileSet) { + fileSet = fileInfo.dir().exists() ? new QCache<QString, bool> : nullptr; + m_importDirCache.insert(path, fileSet); + if (!fileSet) + return false; + } + + const bool exists = fileInfo.exists(); + fileSet->insert(file, new bool(exists)); + return exists; + }; + if (path.at(0) == QLatin1Char(':')) { // qrc resource - QFileInfo fileInfo(path + file); - return fileInfo.isFile(); - } else if (path.count() > 3 && path.at(3) == QLatin1Char(':') && - path.startsWith(QLatin1String("qrc"), Qt::CaseInsensitive)) { + return addToCache(QFileInfo(path + file)); + } + + if (path.count() > 3 && path.at(3) == QLatin1Char(':') + && path.startsWith(QLatin1String("qrc"), Qt::CaseInsensitive)) { // qrc resource url - QFileInfo fileInfo(QQmlFile::urlToLocalFileOrQrc(path + file)); - return fileInfo.isFile(); + return addToCache(QFileInfo(QQmlFile::urlToLocalFileOrQrc(path + file))); } + #if defined(Q_OS_ANDROID) - else if (path.count() > 7 && path.at(6) == QLatin1Char(':') && path.at(7) == QLatin1Char('/') && - path.startsWith(QLatin1String("assets"), Qt::CaseInsensitive)) { + if (path.count() > 7 && path.at(6) == QLatin1Char(':') && path.at(7) == QLatin1Char('/') + && path.startsWith(QLatin1String("assets"), Qt::CaseInsensitive)) { // assets resource url - QFileInfo fileInfo(QQmlFile::urlToLocalFileOrQrc(path + file)); - return fileInfo.isFile(); - } else if (path.count() > 8 && path.at(7) == QLatin1Char(':') && path.at(8) == QLatin1Char('/') && - path.startsWith(QLatin1String("content"), Qt::CaseInsensitive)) { - // content url - QFileInfo fileInfo(QQmlFile::urlToLocalFileOrQrc(path + file)); - return fileInfo.isFile(); + return addToCache(QFileInfo(QQmlFile::urlToLocalFileOrQrc(path + file))); } -#endif - LockHolder<QQmlTypeLoader> holder(this); - if (!m_importDirCache.contains(path)) { - bool exists = QDir(path).exists(); - QCache<QString, bool> *entry = exists ? new QCache<QString, bool> : nullptr; - m_importDirCache.insert(path, entry); + if (path.count() > 8 && path.at(7) == QLatin1Char(':') && path.at(8) == QLatin1Char('/') + && path.startsWith(QLatin1String("content"), Qt::CaseInsensitive)) { + // content url + return addToCache(QFileInfo(QQmlFile::urlToLocalFileOrQrc(path + file))); } - QCache<QString, bool> *fileSet = m_importDirCache.object(path); - if (!fileSet) - return false; +#endif - bool *value = fileSet->object(file); - if (value) { - return *value; - } else { - bool exists = QFile::exists(path + file); - fileSet->insert(file, new bool(exists)); - return exists; - } + return addToCache(QFileInfo(path + file)); } |