summaryrefslogtreecommitdiffstats
path: root/Source/cmDefinitions.cxx
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2014-10-24 16:58:12 (GMT)
committerBrad King <brad.king@kitware.com>2014-10-24 17:31:21 (GMT)
commit5f414cefb6524d26329484b296004e3c2d97ec4f (patch)
tree6a6edc8f85577dcf22f157488bb809e8733b2cbb /Source/cmDefinitions.cxx
parent5abfde6cb8a1ae0b2825797eab6c2e9842eb7c49 (diff)
downloadCMake-5f414cefb6524d26329484b296004e3c2d97ec4f.zip
CMake-5f414cefb6524d26329484b296004e3c2d97ec4f.tar.gz
CMake-5f414cefb6524d26329484b296004e3c2d97ec4f.tar.bz2
Revert "cmDefinitions: Don't store parent lookups"
This reverts commit 5abfde6cb8a1ae0b2825797eab6c2e9842eb7c49. The behaviors associated with implicit pulldown on variable lookup seriously conflict with the optimizations made in these commits. Basically, since values were copied upon variable lookup, not just on PARENT_SCOPE, coupled with PARENT_SCOPE's behavior based on whether the variable is in the current scope or not causes serious problems with not storing a value for every variable at every scope. The commit changed behavior of the following example, among other cases: function(test_set) set(blah "value2") message("before PARENT_SCOPE blah=${blah}") set(blah ${blah} PARENT_SCOPE) message("after PARENT_SCOPE blah=${blah}") endfunction() set(blah value1) test_set() message("in parent scope, blah=${blah}") Reported-by: Alex Merry <alex.merry@kde.org> Reported-by: Ben Cooksley <bcooksley@kde.org>
Diffstat (limited to 'Source/cmDefinitions.cxx')
-rw-r--r--Source/cmDefinitions.cxx22
1 files changed, 5 insertions, 17 deletions
diff --git a/Source/cmDefinitions.cxx b/Source/cmDefinitions.cxx
index 98becf8..babf1c4 100644
--- a/Source/cmDefinitions.cxx
+++ b/Source/cmDefinitions.cxx
@@ -28,7 +28,7 @@ void cmDefinitions::Reset(cmDefinitions* parent)
//----------------------------------------------------------------------------
cmDefinitions::Def const&
-cmDefinitions::GetInternal(const std::string& key) const
+cmDefinitions::GetInternal(const std::string& key)
{
MapType::const_iterator i = this->Map.find(key);
if(i != this->Map.end())
@@ -37,8 +37,9 @@ cmDefinitions::GetInternal(const std::string& key) const
}
else if(cmDefinitions* up = this->Up)
{
- // Query the parent scope.
- return up->GetInternal(key);
+ // Query the parent scope and store the result locally.
+ Def def = up->GetInternal(key);
+ return this->Map.insert(MapType::value_type(key, def)).first->second;
}
return this->NoDef;
}
@@ -70,26 +71,13 @@ cmDefinitions::SetInternal(const std::string& key, Def const& def)
}
//----------------------------------------------------------------------------
-const char* cmDefinitions::Get(const std::string& key) const
+const char* cmDefinitions::Get(const std::string& key)
{
Def const& def = this->GetInternal(key);
return def.Exists? def.c_str() : 0;
}
//----------------------------------------------------------------------------
-void cmDefinitions::Pull(const std::string& key)
-{
- if (this->Up)
- {
- Def const& def = this->Up->GetInternal(key);
- if (def.Exists)
- {
- this->SetInternal(key, def);
- }
- }
-}
-
-//----------------------------------------------------------------------------
const char* cmDefinitions::Set(const std::string& key, const char* value)
{
Def const& def = this->SetInternal(key, Def(value));