cmMakefile: Remove VarUsageStack.
Store usage information in the cmDefintions value instead. We already pay for the memory as padding in the Def struct, so we might as well use it.
This commit is contained in:
parent
2b09d9f346
commit
b9f9915516
|
@ -21,9 +21,10 @@ cmDefinitions::Def const& cmDefinitions::GetInternal(
|
|||
const std::string& key, StackIter begin, StackIter end, bool raise)
|
||||
{
|
||||
assert(begin != end);
|
||||
MapType::const_iterator i = begin->Map.find(key);
|
||||
MapType::iterator i = begin->Map.find(key);
|
||||
if (i != begin->Map.end())
|
||||
{
|
||||
i->second.Used = true;
|
||||
return i->second;
|
||||
}
|
||||
StackIter it = begin;
|
||||
|
@ -76,7 +77,7 @@ void cmDefinitions::Set(const std::string& key, const char* value)
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::vector<std::string> cmDefinitions::LocalKeys() const
|
||||
std::vector<std::string> cmDefinitions::UnusedKeys() const
|
||||
{
|
||||
std::vector<std::string> keys;
|
||||
keys.reserve(this->Map.size());
|
||||
|
@ -84,7 +85,7 @@ std::vector<std::string> cmDefinitions::LocalKeys() const
|
|||
for(MapType::const_iterator mi = this->Map.begin();
|
||||
mi != this->Map.end(); ++mi)
|
||||
{
|
||||
if (mi->second.Exists)
|
||||
if (!mi->second.Used)
|
||||
{
|
||||
keys.push_back(mi->first);
|
||||
}
|
||||
|
|
|
@ -46,8 +46,7 @@ public:
|
|||
/** Set (or unset if null) a value associated with a key. */
|
||||
void Set(const std::string& key, const char* value);
|
||||
|
||||
/** Get the set of all local keys. */
|
||||
std::vector<std::string> LocalKeys() const;
|
||||
std::vector<std::string> UnusedKeys() const;
|
||||
|
||||
static std::vector<std::string> ClosureKeys(StackConstIter begin,
|
||||
StackConstIter end);
|
||||
|
@ -61,11 +60,16 @@ private:
|
|||
private:
|
||||
typedef std::string std_string;
|
||||
public:
|
||||
Def(): std_string(), Exists(false) {}
|
||||
Def(const char* v): std_string(v?v:""), Exists(v?true:false) {}
|
||||
Def(const std_string& v): std_string(v), Exists(true) {}
|
||||
Def(Def const& d): std_string(d), Exists(d.Exists) {}
|
||||
Def(): std_string(), Exists(false), Used(false) {}
|
||||
Def(const char* v)
|
||||
: std_string(v ? v : ""),
|
||||
Exists(v ? true : false),
|
||||
Used(false)
|
||||
{}
|
||||
Def(const std_string& v): std_string(v), Exists(true), Used(false) {}
|
||||
Def(Def const& d): std_string(d), Exists(d.Exists), Used(d.Used) {}
|
||||
bool Exists;
|
||||
bool Used;
|
||||
};
|
||||
static Def NoDef;
|
||||
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
#include <cmsys/FStream.hxx>
|
||||
#include <cmsys/auto_ptr.hxx>
|
||||
|
||||
#include <stack>
|
||||
#include <list>
|
||||
#include <ctype.h> // for isspace
|
||||
#include <assert.h>
|
||||
|
@ -47,7 +46,6 @@ class cmMakefile::Internals
|
|||
{
|
||||
public:
|
||||
std::list<cmDefinitions> VarStack;
|
||||
std::stack<std::set<std::string> > VarUsageStack;
|
||||
bool IsSourceFileTryCompile;
|
||||
|
||||
void PushDefinitions()
|
||||
|
@ -84,9 +82,9 @@ public:
|
|||
this->VarStack.back().Set(name, 0);
|
||||
}
|
||||
|
||||
std::vector<std::string> LocalKeys() const
|
||||
std::vector<std::string> UnusedKeys() const
|
||||
{
|
||||
return this->VarStack.back().LocalKeys();
|
||||
return this->VarStack.back().UnusedKeys();
|
||||
}
|
||||
|
||||
std::vector<std::string> ClosureKeys() const
|
||||
|
@ -142,7 +140,6 @@ cmMakefile::cmMakefile(cmLocalGenerator* localGenerator)
|
|||
StateSnapshot(localGenerator->GetStateSnapshot())
|
||||
{
|
||||
this->Internal->PushDefinitions();
|
||||
this->Internal->VarUsageStack.push(std::set<std::string>());
|
||||
this->Internal->IsSourceFileTryCompile = false;
|
||||
|
||||
// Initialize these first since AddDefaultDefinitions calls AddDefinition
|
||||
|
@ -588,7 +585,6 @@ bool cmMakefile::ReadListFile(const char* listfile,
|
|||
|
||||
if (res)
|
||||
{
|
||||
// Check for unused variables
|
||||
this->CheckForUnusedVariables();
|
||||
}
|
||||
|
||||
|
@ -1726,7 +1722,6 @@ void cmMakefile::AddDefinition(const std::string& name, const char* value)
|
|||
if (this->VariableInitialized(name))
|
||||
{
|
||||
this->LogUnused("changing definition", name);
|
||||
this->Internal->VarUsageStack.top().erase(name);
|
||||
}
|
||||
this->Internal->SetDefinition(name, value);
|
||||
|
||||
|
@ -1800,7 +1795,6 @@ void cmMakefile::AddDefinition(const std::string& name, bool value)
|
|||
if (this->VariableInitialized(name))
|
||||
{
|
||||
this->LogUnused("changing definition", name);
|
||||
this->Internal->VarUsageStack.top().erase(name);
|
||||
}
|
||||
this->Internal->SetDefinition(name, value ? "ON" : "OFF");
|
||||
#ifdef CMAKE_BUILD_WITH_CMAKE
|
||||
|
@ -1819,9 +1813,9 @@ void cmMakefile::CheckForUnusedVariables() const
|
|||
{
|
||||
return;
|
||||
}
|
||||
const std::vector<std::string>& locals = this->Internal->LocalKeys();
|
||||
std::vector<std::string>::const_iterator it = locals.begin();
|
||||
for (; it != locals.end(); ++it)
|
||||
const std::vector<std::string>& unused = this->Internal->UnusedKeys();
|
||||
std::vector<std::string>::const_iterator it = unused.begin();
|
||||
for (; it != unused.end(); ++it)
|
||||
{
|
||||
this->LogUnused("out of scope", *it);
|
||||
}
|
||||
|
@ -1829,7 +1823,7 @@ void cmMakefile::CheckForUnusedVariables() const
|
|||
|
||||
void cmMakefile::MarkVariableAsUsed(const std::string& var)
|
||||
{
|
||||
this->Internal->VarUsageStack.top().insert(var);
|
||||
this->Internal->GetDefinition(var);
|
||||
}
|
||||
|
||||
bool cmMakefile::VariableInitialized(const std::string& var) const
|
||||
|
@ -1837,20 +1831,10 @@ bool cmMakefile::VariableInitialized(const std::string& var) const
|
|||
return this->Internal->IsInitialized(var);
|
||||
}
|
||||
|
||||
bool cmMakefile::VariableUsed(const std::string& var) const
|
||||
{
|
||||
if(this->Internal->VarUsageStack.top().find(var) !=
|
||||
this->Internal->VarUsageStack.top().end())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void cmMakefile::LogUnused(const char* reason,
|
||||
const std::string& name) const
|
||||
{
|
||||
if (this->WarnUnused && !this->VariableUsed(name))
|
||||
if (this->WarnUnused)
|
||||
{
|
||||
std::string path;
|
||||
cmListFileBacktrace bt(this->GetLocalGenerator());
|
||||
|
@ -1891,7 +1875,6 @@ void cmMakefile::RemoveDefinition(const std::string& name)
|
|||
if (this->VariableInitialized(name))
|
||||
{
|
||||
this->LogUnused("unsetting", name);
|
||||
this->Internal->VarUsageStack.top().erase(name);
|
||||
}
|
||||
this->Internal->RemoveDefinition(name);
|
||||
#ifdef CMAKE_BUILD_WITH_CMAKE
|
||||
|
@ -2360,7 +2343,6 @@ const char* cmMakefile::GetRequiredDefinition(const std::string& name) const
|
|||
bool cmMakefile::IsDefinitionSet(const std::string& name) const
|
||||
{
|
||||
const char* def = this->Internal->GetDefinition(name);
|
||||
this->Internal->VarUsageStack.top().insert(name);
|
||||
if(!def)
|
||||
{
|
||||
def = this->GetState()->GetInitializedCacheValue(name);
|
||||
|
@ -2381,10 +2363,6 @@ bool cmMakefile::IsDefinitionSet(const std::string& name) const
|
|||
|
||||
const char* cmMakefile::GetDefinition(const std::string& name) const
|
||||
{
|
||||
if (this->WarnUnused)
|
||||
{
|
||||
this->Internal->VarUsageStack.top().insert(name);
|
||||
}
|
||||
const char* def = this->Internal->GetDefinition(name);
|
||||
if(!def)
|
||||
{
|
||||
|
@ -4312,8 +4290,6 @@ std::string cmMakefile::FormatListFileStack() const
|
|||
void cmMakefile::PushScope()
|
||||
{
|
||||
this->Internal->PushDefinitions();
|
||||
const std::set<std::string>& usage = this->Internal->VarUsageStack.top();
|
||||
this->Internal->VarUsageStack.push(usage);
|
||||
|
||||
this->PushLoopBlockBarrier();
|
||||
|
||||
|
@ -4330,27 +4306,9 @@ void cmMakefile::PopScope()
|
|||
|
||||
this->PopLoopBlockBarrier();
|
||||
|
||||
std::set<std::string> usage = this->Internal->VarUsageStack.top();
|
||||
const std::vector<std::string>& locals = this->Internal->LocalKeys();
|
||||
// Remove initialization and usage information for variables in the local
|
||||
// scope.
|
||||
std::vector<std::string>::const_iterator it = locals.begin();
|
||||
for (; it != locals.end(); ++it)
|
||||
{
|
||||
if (!this->VariableUsed(*it))
|
||||
{
|
||||
this->LogUnused("out of scope", *it);
|
||||
}
|
||||
else
|
||||
{
|
||||
usage.erase(*it);
|
||||
}
|
||||
}
|
||||
this->CheckForUnusedVariables();
|
||||
|
||||
this->Internal->PopDefinitions();
|
||||
this->Internal->VarUsageStack.pop();
|
||||
// Push usage up to the parent scope.
|
||||
this->Internal->VarUsageStack.top().insert(usage.begin(), usage.end());
|
||||
}
|
||||
|
||||
void cmMakefile::RaiseScope(const std::string& var, const char *varDef)
|
||||
|
|
|
@ -69,8 +69,6 @@ public:
|
|||
void MarkVariableAsUsed(const std::string& var);
|
||||
/* return true if a variable has been initialized */
|
||||
bool VariableInitialized(const std::string& ) const;
|
||||
/* return true if a variable has been used */
|
||||
bool VariableUsed(const std::string& ) const;
|
||||
|
||||
/**
|
||||
* Construct an empty makefile.
|
||||
|
|
Loading…
Reference in New Issue