diff options
| author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-03-25 10:26:50 +0100 |
|---|---|---|
| committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-03-26 18:05:55 +0100 |
| commit | 74dddf4234b92b50ce940e282bd6497d4c04edb2 (patch) | |
| tree | 351a52226bd5dc5c03ffdbfede53876910581749 | |
| parent | 37a9936b1d9f2e7800249c47a044ccd7d7d3c26a (diff) | |
| download | qbs-74dddf4234b92b50ce940e282bd6497d4c04edb2.tar.gz | |
cache module prototype item trees
Module prototypes can safely be reused.
For the qbs build this saves roughly 70% of memory.
Task-number: QBS-120
Change-Id: I2501e05088634d3403b1f8d1b424194f8e6a041a
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
| -rw-r--r-- | src/lib/corelib/language/itemreader.cpp | 23 | ||||
| -rw-r--r-- | src/lib/corelib/language/itemreader.h | 6 | ||||
| -rw-r--r-- | src/lib/corelib/language/itemreaderastvisitor.cpp | 3 | ||||
| -rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 3 |
4 files changed, 27 insertions, 8 deletions
diff --git a/src/lib/corelib/language/itemreader.cpp b/src/lib/corelib/language/itemreader.cpp index ba4859899..2a1d125aa 100644 --- a/src/lib/corelib/language/itemreader.cpp +++ b/src/lib/corelib/language/itemreader.cpp @@ -128,6 +128,11 @@ QStringList ItemReader::searchPaths() const return paths; } +void ItemReader::clearItemCache() +{ + m_itemCache.clear(); +} + void ItemReader::cacheDirectoryEntries(const QString &dirPath, const QStringList &entries) { m_directoryEntries.insert(dirPath, entries); @@ -142,9 +147,9 @@ bool ItemReader::findDirectoryEntries(const QString &dirPath, QStringList *entri return true; } -Item *ItemReader::readFile(const QString &filePath) +Item *ItemReader::readFile(const QString &filePath, bool enableItemCache) { - Item * const item = internalReadFile(filePath).rootItem; + Item * const item = internalReadFile(filePath, enableItemCache).rootItem; return item; } @@ -153,8 +158,15 @@ QSet<QString> ItemReader::filesRead() const return m_filesRead; } -ItemReaderResult ItemReader::internalReadFile(const QString &filePath) +ItemReaderResult ItemReader::internalReadFile(const QString &filePath, bool enableItemCache) { + ItemReaderResult result; + if (enableItemCache) { + result = m_itemCache.value(filePath); + if (result.rootItem) + return result; + } + ASTCacheValue &cacheValue = (*m_astCache)[filePath]; if (cacheValue.isValid()) { if (Q_UNLIKELY(cacheValue.isProcessing())) @@ -185,13 +197,16 @@ ItemReaderResult ItemReader::internalReadFile(const QString &filePath) cacheValue.setAst(parser.ast()); } - ItemReaderResult result; ItemReaderASTVisitor itemReader(this, &result); itemReader.setFilePath(QFileInfo(filePath).absoluteFilePath()); itemReader.setSourceCode(cacheValue.code()); cacheValue.setProcessingFlag(true); cacheValue.ast()->accept(&itemReader); cacheValue.setProcessingFlag(false); + + if (enableItemCache) + m_itemCache.insert(filePath, result); + return result; } diff --git a/src/lib/corelib/language/itemreader.h b/src/lib/corelib/language/itemreader.h index 266c30f93..75921577c 100644 --- a/src/lib/corelib/language/itemreader.h +++ b/src/lib/corelib/language/itemreader.h @@ -81,12 +81,13 @@ public: void popExtraSearchPaths(); QStringList searchPaths() const; - Item *readFile(const QString &filePath); + void clearItemCache(); + Item *readFile(const QString &filePath, bool enableItemCache = false); QSet<QString> filesRead() const; private: - ItemReaderResult internalReadFile(const QString &filePath); + ItemReaderResult internalReadFile(const QString &filePath, bool enableItemCache); void cacheDirectoryEntries(const QString &dirPath, const QStringList &entries); bool findDirectoryEntries(const QString &dirPath, QStringList *entries) const; @@ -100,6 +101,7 @@ private: class ASTCache; ASTCache *m_astCache; + QHash<QString, ItemReaderResult> m_itemCache; QSet<QString> m_filesRead; QHash<QString, QStringList> m_directoryEntries; }; diff --git a/src/lib/corelib/language/itemreaderastvisitor.cpp b/src/lib/corelib/language/itemreaderastvisitor.cpp index a48e259ac..9a333a989 100644 --- a/src/lib/corelib/language/itemreaderastvisitor.cpp +++ b/src/lib/corelib/language/itemreaderastvisitor.cpp @@ -312,7 +312,8 @@ bool ItemReaderASTVisitor::visit(AST::UiObjectDefinition *ast) const QStringList fullTypeName = toStringList(ast->qualifiedTypeNameId); const QString baseTypeFileName = m_typeNameToFile.value(fullTypeName); if (!baseTypeFileName.isEmpty()) { - const ItemReaderResult baseFile = m_reader->internalReadFile(baseTypeFileName); + const ItemReaderResult baseFile = m_reader->internalReadFile(baseTypeFileName, false); + inheritItem(item, baseFile.rootItem, baseFile); if (baseFile.rootItem->m_file->m_idScope) { // Make ids from the derived file visible in the base file. diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 2af998b28..caa427423 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -101,6 +101,7 @@ ModuleLoaderResult ModuleLoader::load(const QString &filePath, { if (m_logger.traceEnabled()) m_logger.qbsTrace() << "[MODLDR] load" << filePath; + m_reader->clearItemCache(); m_overriddenProperties = overriddenProperties; m_buildConfigProperties = buildConfigProperties; m_validItemPropertyNamesPerItem.clear(); @@ -759,7 +760,7 @@ Item *ModuleLoader::loadModuleFile(ProductContext *productContext, const QString m_logger.qbsTrace() << "[LDR] loadModuleFile " << filePath; *cacheHit = false; - module = m_reader->readFile(filePath); + module = m_reader->readFile(filePath, true); if (!isBaseModule) { DependsContext dependsContext; dependsContext.product = productContext; |
