Commit 5abfde6c authored by Ben Boeckel's avatar Ben Boeckel
Browse files

cmDefinitions: Don't store parent lookups

When looking up scopes, it is faster to not store the lookup locally to
keep the maps smaller and avoid extra allocations and rebalancing.
parent 9e8fa104
......@@ -28,7 +28,7 @@ void cmDefinitions::Reset(cmDefinitions* parent)
//----------------------------------------------------------------------------
cmDefinitions::Def const&
cmDefinitions::GetInternal(const std::string& key)
cmDefinitions::GetInternal(const std::string& key) const
{
MapType::const_iterator i = this->Map.find(key);
if(i != this->Map.end())
......@@ -37,9 +37,8 @@ cmDefinitions::GetInternal(const std::string& key)
}
else if(cmDefinitions* up = this->Up)
{
// 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;
// Query the parent scope.
return up->GetInternal(key);
}
return this->NoDef;
}
......@@ -71,12 +70,25 @@ cmDefinitions::SetInternal(const std::string& key, Def const& def)
}
//----------------------------------------------------------------------------
const char* cmDefinitions::Get(const std::string& key)
const char* cmDefinitions::Get(const std::string& key) const
{
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)
{
......
......@@ -33,9 +33,11 @@ public:
/** Returns the parent scope, if any. */
cmDefinitions* GetParent() const { return this->Up; }
/** Get the value associated with a key; null if none.
Store the result locally if it came from a parent. */
const char* Get(const std::string& key);
/** Get the value associated with a key; null if none. */
const char* Get(const std::string& key) const;
/** Pull a variable from the parent. */
void Pull(const std::string& key);
/** Set (or unset if null) a value associated with a key. */
const char* Set(const std::string& key, const char* value);
......@@ -73,7 +75,7 @@ private:
MapType Map;
// Internal query and update methods.
Def const& GetInternal(const std::string& key);
Def const& GetInternal(const std::string& key) const;
Def const& SetInternal(const std::string& key, Def const& def);
// Implementation of Closure() method.
......
......@@ -4422,7 +4422,7 @@ void cmMakefile::RaiseScope(const std::string& var, const char *varDef)
if(cmDefinitions* up = cur.GetParent())
{
// First localize the definition in the current scope.
cur.Get(var);
cur.Pull(var);
// Now update the definition in the parent scope.
up->Set(var, varDef);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment