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.
This commit is contained in:
parent
9e8fa1043c
commit
5abfde6cb8
|
@ -28,7 +28,7 @@ void cmDefinitions::Reset(cmDefinitions* parent)
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmDefinitions::Def const&
|
cmDefinitions::Def const&
|
||||||
cmDefinitions::GetInternal(const std::string& key)
|
cmDefinitions::GetInternal(const std::string& key) const
|
||||||
{
|
{
|
||||||
MapType::const_iterator i = this->Map.find(key);
|
MapType::const_iterator i = this->Map.find(key);
|
||||||
if(i != this->Map.end())
|
if(i != this->Map.end())
|
||||||
|
@ -37,9 +37,8 @@ cmDefinitions::GetInternal(const std::string& key)
|
||||||
}
|
}
|
||||||
else if(cmDefinitions* up = this->Up)
|
else if(cmDefinitions* up = this->Up)
|
||||||
{
|
{
|
||||||
// Query the parent scope and store the result locally.
|
// Query the parent scope.
|
||||||
Def def = up->GetInternal(key);
|
return up->GetInternal(key);
|
||||||
return this->Map.insert(MapType::value_type(key, def)).first->second;
|
|
||||||
}
|
}
|
||||||
return this->NoDef;
|
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);
|
Def const& def = this->GetInternal(key);
|
||||||
return def.Exists? def.c_str() : 0;
|
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)
|
const char* cmDefinitions::Set(const std::string& key, const char* value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,9 +33,11 @@ public:
|
||||||
/** Returns the parent scope, if any. */
|
/** Returns the parent scope, if any. */
|
||||||
cmDefinitions* GetParent() const { return this->Up; }
|
cmDefinitions* GetParent() const { return this->Up; }
|
||||||
|
|
||||||
/** Get the value associated with a key; null if none.
|
/** 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) const;
|
||||||
const char* Get(const std::string& key);
|
|
||||||
|
/** Pull a variable from the parent. */
|
||||||
|
void Pull(const std::string& key);
|
||||||
|
|
||||||
/** Set (or unset if null) a value associated with a key. */
|
/** Set (or unset if null) a value associated with a key. */
|
||||||
const char* Set(const std::string& key, const char* value);
|
const char* Set(const std::string& key, const char* value);
|
||||||
|
@ -73,7 +75,7 @@ private:
|
||||||
MapType Map;
|
MapType Map;
|
||||||
|
|
||||||
// Internal query and update methods.
|
// 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);
|
Def const& SetInternal(const std::string& key, Def const& def);
|
||||||
|
|
||||||
// Implementation of Closure() method.
|
// Implementation of Closure() method.
|
||||||
|
|
|
@ -4422,7 +4422,7 @@ void cmMakefile::RaiseScope(const std::string& var, const char *varDef)
|
||||||
if(cmDefinitions* up = cur.GetParent())
|
if(cmDefinitions* up = cur.GetParent())
|
||||||
{
|
{
|
||||||
// First localize the definition in the current scope.
|
// First localize the definition in the current scope.
|
||||||
cur.Get(var);
|
cur.Pull(var);
|
||||||
|
|
||||||
// Now update the definition in the parent scope.
|
// Now update the definition in the parent scope.
|
||||||
up->Set(var, varDef);
|
up->Set(var, varDef);
|
||||||
|
|
Loading…
Reference in New Issue