aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@theqtcompany.com>2015-08-03 12:33:20 +0200
committerChristian Kandeler <christian.kandeler@theqtcompany.com>2015-08-03 11:51:01 +0000
commit4d74073d1a16fdd8479a85f3ba0d297fb4a7c318 (patch)
tree914ca04311295fd9e2338a17458c48ca569724e8
parent802953ca215c438c09454cd95d443fd0d597ad25 (diff)
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>
-rw-r--r--src/lib/corelib/language/modulemerger.cpp18
-rw-r--r--src/lib/corelib/language/modulemerger.h3
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;