summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorRolf Eike Beer <eike@sf-mail.de>2016-04-20 20:40:58 (GMT)
committerRolf Eike Beer <eike@sf-mail.de>2016-04-20 21:33:17 (GMT)
commit068358e1edd4ed0c19a40f3be16edb64123f45ee (patch)
tree2fa1f1425a75baf2024ef1829c3ad3d0dbf58f9f /Source
parent484958b781dcfaf12a29a5c916277fc7d4b01fbd (diff)
downloadCMake-068358e1edd4ed0c19a40f3be16edb64123f45ee.zip
CMake-068358e1edd4ed0c19a40f3be16edb64123f45ee.tar.gz
CMake-068358e1edd4ed0c19a40f3be16edb64123f45ee.tar.bz2
cmMakefile::AddCacheDefinition: avoid conversions between char* and string
Running the testsuite this function is entered more than 126,000 times. Reorder the code flow so that a conversion from char* to std::string is only done when the cache entry is a path one, which happens only ~50 times during the testsuite.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmMakefile.cxx21
1 files changed, 11 insertions, 10 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 3a56c2a..f01ff74 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1824,10 +1824,11 @@ void cmMakefile::AddCacheDefinition(const std::string& name, const char* value,
cmState::CacheEntryType type,
bool force)
{
- bool haveVal = value ? true : false;
- std::string val = haveVal ? value : "";
const char* existingValue =
this->GetState()->GetInitializedCacheValue(name);
+ // must be outside the following if() to keep it alive long enough
+ std::string nvalue;
+
if(existingValue
&& (this->GetState()->GetCacheEntryType(name)
== cmState::UNINITIALIZED))
@@ -1836,15 +1837,16 @@ void cmMakefile::AddCacheDefinition(const std::string& name, const char* value,
// if it is a force, then use the value being passed in
if(!force)
{
- val = existingValue;
- haveVal = true;
+ value = existingValue;
}
if ( type == cmState::PATH || type == cmState::FILEPATH )
{
std::vector<std::string>::size_type cc;
std::vector<std::string> files;
- std::string nvalue = "";
- cmSystemTools::ExpandListArgument(val, files);
+ nvalue = value ? value : "";
+
+ cmSystemTools::ExpandListArgument(nvalue, files);
+ nvalue = "";
for ( cc = 0; cc < files.size(); cc ++ )
{
if(!cmSystemTools::IsOff(files[cc].c_str()))
@@ -1859,13 +1861,12 @@ void cmMakefile::AddCacheDefinition(const std::string& name, const char* value,
}
this->GetCMakeInstance()->AddCacheEntry(name, nvalue.c_str(), doc, type);
- val = this->GetState()->GetInitializedCacheValue(name);
- haveVal = true;
+ nvalue = this->GetState()->GetInitializedCacheValue(name);
+ value = nvalue.c_str();
}
}
- this->GetCMakeInstance()->AddCacheEntry(name, haveVal ? val.c_str() : 0,
- doc, type);
+ this->GetCMakeInstance()->AddCacheEntry(name, value, doc, type);
// if there was a definition then remove it
this->StateSnapshot.RemoveDefinition(name);
}