summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus
diff options
context:
space:
mode:
authorPrzemyslaw Gorszkowski <pgorszkowski@gmail.com>2013-02-27 07:40:55 +0100
committerErik Verbruggen <erik.verbruggen@digia.com>2013-02-27 10:36:08 +0100
commit600f4438bb8e729535c335b0083ba67bb788f3a2 (patch)
treef2c9ea7f90fa811653971b116ae3780a6bfee46f /src/libs/cplusplus
parent9a556a61d05cf472088a4f7a61e263eb49960404 (diff)
downloadqt-creator-600f4438bb8e729535c335b0083ba67bb788f3a2.tar.gz
C++: performance improvement for template instantiation
Add cache for instantiated instantiations in base template class. Change-Id: I5c457ea4dfeab72cc3910f0092ca1bc14b8aa1ac Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp11
-rw-r--r--src/libs/cplusplus/LookupContext.h1
2 files changed, 10 insertions, 2 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index ef259bb254..4562d41346 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -749,6 +749,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
return 0;
ClassOrNamespace *reference = it->second;
+ ClassOrNamespace *baseTemplateClassReference = reference;
const TemplateNameId *templId = name->asTemplateNameId();
if (templId) {
@@ -764,7 +765,8 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
if (templId->isSpecialization()) {
// if it is a specialization we try to find or create new one and
// add to base class(reference)
- TemplateNameIdTable::const_iterator cit = reference->_specializations.find(templId);
+ TemplateNameIdTable::const_iterator cit
+ = reference->_specializations.find(templId);
if (cit != reference->_specializations.end()) {
return cit->second;
} else {
@@ -776,6 +778,10 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
return newSpecialization;
}
} else {
+ QMap<const TemplateNameId *, ClassOrNamespace *>::const_iterator citInstantiation
+ = reference->_instantiations.find(templId);
+ if (citInstantiation != reference->_instantiations.end())
+ return citInstantiation.value();
TemplateNameId *nonConstTemplId = const_cast<TemplateNameId *>(templId);
// make this instantiation looks like specialization which help to find
// full specialization for this instantiation
@@ -833,7 +839,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
// construct all instantiation data.
if (templId) {
_alreadyConsideredTemplates.insert(templId);
- ClassOrNamespace *instantiation = _factory->allocClassOrNamespace(reference);
+ ClassOrNamespace *instantiation = _factory->allocClassOrNamespace(baseTemplateClassReference);
#ifdef DEBUG_LOOKUP
instantiation->_name = templId;
#endif // DEBUG_LOOKUP
@@ -960,6 +966,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
}
_alreadyConsideredTemplates.clear(templId);
+ baseTemplateClassReference->_instantiations[templId] = instantiation;
return instantiation;
}
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 87efcefbb7..88506c1e8f 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -113,6 +113,7 @@ private:
QList<Symbol *> _todo;
QSharedPointer<Control> _control;
TemplateNameIdTable _specializations;
+ QMap<const TemplateNameId *, ClassOrNamespace *> _instantiations;
// it's an instantiation.
const TemplateNameId *_templateId;