diff options
author | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-08-03 12:33:20 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-08-03 11:51:01 +0000 |
commit | 4d74073d1a16fdd8479a85f3ba0d297fb4a7c318 (patch) | |
tree | 914ca04311295fd9e2338a17458c48ca569724e8 /src | |
parent | 802953ca215c438c09454cd95d443fd0d597ad25 (diff) | |
download | qbs-4d74073d1a16fdd8479a85f3ba0d297fb4a7c318.tar.gz |
Fix excessive memory usage in ModuleMerger.
No need to clone the prototype item for every single list property.
Change-Id: Iccde5172aa093ca1df25d93fbf3c336ed3445ab0
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/corelib/language/modulemerger.cpp | 18 | ||||
-rw-r--r-- | src/lib/corelib/language/modulemerger.h | 3 |
2 files changed, 12 insertions, 9 deletions
diff --git a/src/lib/corelib/language/modulemerger.cpp b/src/lib/corelib/language/modulemerger.cpp index b32361b79..85405d21a 100644 --- a/src/lib/corelib/language/modulemerger.cpp +++ b/src/lib/corelib/language/modulemerger.cpp @@ -193,7 +193,7 @@ void ModuleMerger::pullListProperties(Item::PropertyMap *dst, Item *instance) } void ModuleMerger::appendPrototypeValueToNextChain(Item *moduleProto, const QString &propertyName, - const ValuePtr &sv) const + const ValuePtr &sv) { const PropertyDeclaration pd = m_mergedModuleItem->propertyDeclaration(propertyName); if (pd.isScalar()) @@ -201,14 +201,16 @@ void ModuleMerger::appendPrototypeValueToNextChain(Item *moduleProto, const QStr ValuePtr protoValue = moduleProto->property(propertyName); if (!protoValue) return; - Item * const clonedModulePrototype = moduleProto->clone(); - Item * const scope = Item::create(clonedModulePrototype->pool()); - scope->setFile(clonedModulePrototype->file()); - m_mergedModuleItem->scope()->copyProperty(QLatin1String("project"), scope); - m_mergedModuleItem->scope()->copyProperty(QLatin1String("product"), scope); - clonedModulePrototype->setScope(scope); + if (!m_clonedModulePrototype) { + m_clonedModulePrototype = moduleProto->clone(); + Item * const scope = Item::create(m_clonedModulePrototype->pool()); + scope->setFile(m_clonedModulePrototype->file()); + m_mergedModuleItem->scope()->copyProperty(QLatin1String("project"), scope); + m_mergedModuleItem->scope()->copyProperty(QLatin1String("product"), scope); + m_clonedModulePrototype->setScope(scope); + } const ValuePtr clonedValue = protoValue->clone(); - clonedValue->setDefiningItem(clonedModulePrototype); + clonedValue->setDefiningItem(m_clonedModulePrototype); lastInNextChain(sv)->setNext(clonedValue); } diff --git a/src/lib/corelib/language/modulemerger.h b/src/lib/corelib/language/modulemerger.h index 3b417191b..32614bc18 100644 --- a/src/lib/corelib/language/modulemerger.h +++ b/src/lib/corelib/language/modulemerger.h @@ -54,12 +54,13 @@ private: void mergeOutProps(Item::PropertyMap *dst, const Item::PropertyMap &src); void pullListProperties(Item::PropertyMap *dst, Item *instance); void appendPrototypeValueToNextChain(Item *moduleProto, const QString &propertyName, - const ValuePtr &sv) const; + const ValuePtr &sv); static ValuePtr lastInNextChain(const ValuePtr &v); const Logger &m_logger; Item * const m_rootItem; Item *m_mergedModuleItem; + Item *m_clonedModulePrototype = nullptr; const QualifiedId m_moduleName; QHash<ValuePtr, PropertyDeclaration> m_decls; QSet<const Item *> m_seenInstancesTopDown; |