diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-09-04 10:17:15 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-10-17 12:05:35 +0200 |
commit | 80468b17460ebb07b349c071f095da71514a80f6 (patch) | |
tree | 6c4943079ee8f7fecf22a4750ca2c2075792e8f8 /src/qml/qml/qqmltypeloader.cpp | |
parent | ad3e13d97367aade27b328306a19d78f68331fa8 (diff) |
Extend typeloader file cache to also cover resources
Looking up resources is still expensive, less so than real files, but
worth the optimization.
Task-number: QTBUG-77237
Change-Id: I4dcc77bf63d3f03b7b5504668e879abd09373fa1
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/qml/qqmltypeloader.cpp')
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 54f94d6a11..997490361c 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -973,48 +973,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)); } |