From 068358e1edd4ed0c19a40f3be16edb64123f45ee Mon Sep 17 00:00:00 2001 From: Rolf Eike Beer Date: Wed, 20 Apr 2016 22:40:58 +0200 Subject: [PATCH] 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. --- Source/cmMakefile.cxx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 3a56c2aac..f01ff74bc 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::size_type cc; std::vector 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); }