summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2014-03-25 10:26:50 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2014-03-26 18:05:55 +0100
commit74dddf4234b92b50ce940e282bd6497d4c04edb2 (patch)
tree351a52226bd5dc5c03ffdbfede53876910581749
parent37a9936b1d9f2e7800249c47a044ccd7d7d3c26a (diff)
downloadqbs-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.cpp23
-rw-r--r--src/lib/corelib/language/itemreader.h6
-rw-r--r--src/lib/corelib/language/itemreaderastvisitor.cpp3
-rw-r--r--src/lib/corelib/language/moduleloader.cpp3
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;