summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2015-11-30 11:19:01 -0500
committerBrad King <brad.king@kitware.com>2015-11-30 11:19:01 -0500
commitf8deadc16d03233ecb92b4d05a9e9f0d6c9f56aa (patch)
treee7575d068dacca1e9721535a8500940323930d5c
parent9ecf8a14fb4a12178a7bb97a87dee3fada3204d5 (diff)
parent5f860ebb67e86e0aa407e26ddf79652f73742211 (diff)
downloadcmake-f8deadc16d03233ecb92b4d05a9e9f0d6c9f56aa.tar.gz
Merge branch 'reduce-cmState-accumulation' into release
-rw-r--r--Source/cmLinkedTree.h33
-rw-r--r--Source/cmListFileCache.cxx15
-rw-r--r--Source/cmListFileCache.h6
-rw-r--r--Source/cmLocalGenerator.cxx6
-rw-r--r--Source/cmMakefile.cxx28
-rw-r--r--Source/cmMakefile.h8
-rw-r--r--Source/cmState.cxx90
-rw-r--r--Source/cmState.h1
8 files changed, 121 insertions, 66 deletions
diff --git a/Source/cmLinkedTree.h b/Source/cmLinkedTree.h
index 721a24606c..3b41459c2c 100644
--- a/Source/cmLinkedTree.h
+++ b/Source/cmLinkedTree.h
@@ -24,7 +24,7 @@
needs of the cmState. For example, the Truncate() method is a specific
requirement of the cmState.
- An empty cmLinkedTree provides a Root() method, and an Extend() method,
+ An empty cmLinkedTree provides a Root() method, and an Push() method,
each of which return iterators. A Tree can be built up by extending
from the root, and then extending from any other iterator.
@@ -142,16 +142,37 @@ public:
return iterator(const_cast<cmLinkedTree*>(this), 0);
}
- iterator Extend(iterator it)
+ iterator Push(iterator it)
{
- return Extend_impl(it, T());
+ return Push_impl(it, T());
}
- iterator Extend(iterator it, T t)
+ iterator Push(iterator it, T t)
{
- return Extend_impl(it, t);
+ return Push_impl(it, t);
}
+ bool IsLast(iterator it)
+ {
+ return it.Position == this->Data.size();
+ }
+
+ iterator Pop(iterator it)
+ {
+ assert(!this->Data.empty());
+ assert(this->UpPositions.size() == this->Data.size());
+ bool const isLast = this->IsLast(it);
+ ++it;
+ // If this is the last entry then no other entry can refer
+ // to it so we can drop its storage.
+ if (isLast)
+ {
+ this->Data.pop_back();
+ this->UpPositions.pop_back();
+ }
+ return it;
+ }
+
iterator Truncate()
{
assert(this->UpPositions.size() > 0);
@@ -179,7 +200,7 @@ private:
return &this->Data[pos];
}
- iterator Extend_impl(iterator it, T t)
+ iterator Push_impl(iterator it, T t)
{
assert(this->UpPositions.size() == this->Data.size());
assert(it.Position <= this->UpPositions.size());
diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx
index bff2986158..1465f907be 100644
--- a/Source/cmListFileCache.cxx
+++ b/Source/cmListFileCache.cxx
@@ -398,6 +398,21 @@ bool cmListFileParser::AddArgument(cmListFileLexer_Token* token,
}
}
+cmListFileBacktrace::cmListFileBacktrace(cmState::Snapshot snapshot,
+ cmCommandContext const& cc)
+ : Context(cc)
+ , Snapshot(snapshot)
+{
+ if (this->Snapshot.IsValid())
+ {
+ this->Snapshot.Keep();
+ }
+}
+
+cmListFileBacktrace::~cmListFileBacktrace()
+{
+}
+
void cmListFileBacktrace::PrintTitle(std::ostream& out) const
{
if (!this->Snapshot.IsValid())
diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h
index 0afd7f5d31..17ee10fedc 100644
--- a/Source/cmListFileCache.h
+++ b/Source/cmListFileCache.h
@@ -90,10 +90,8 @@ class cmListFileBacktrace
{
public:
cmListFileBacktrace(cmState::Snapshot snapshot = cmState::Snapshot(),
- cmCommandContext const& cc = cmCommandContext())
- : Context(cc), Snapshot(snapshot)
- {
- }
+ cmCommandContext const& cc = cmCommandContext());
+ ~cmListFileBacktrace();
void PrintTitle(std::ostream& out) const;
void PrintCallStack(std::ostream& out) const;
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index 32304032d0..233e7fe5fc 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -3003,7 +3003,7 @@ void cmLocalGenerator::GenerateAppleInfoPList(cmTarget* target,
// override user make variables. If not the configuration will fall
// back to the directory-level values set by the user.
cmMakefile* mf = this->Makefile;
- mf->PushScope();
+ cmMakefile::ScopePushPop varScope(mf);
mf->AddDefinition("MACOSX_BUNDLE_EXECUTABLE_NAME", targetName.c_str());
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_INFO_STRING");
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_ICON_FILE");
@@ -3014,7 +3014,6 @@ void cmLocalGenerator::GenerateAppleInfoPList(cmTarget* target,
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_BUNDLE_VERSION");
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_COPYRIGHT");
mf->ConfigureFile(inFile.c_str(), fname, false, false, false);
- mf->PopScope();
}
//----------------------------------------------------------------------------
@@ -3047,12 +3046,11 @@ void cmLocalGenerator::GenerateFrameworkInfoPList(cmTarget* target,
// override user make variables. If not the configuration will fall
// back to the directory-level values set by the user.
cmMakefile* mf = this->Makefile;
- mf->PushScope();
+ cmMakefile::ScopePushPop varScope(mf);
mf->AddDefinition("MACOSX_FRAMEWORK_NAME", targetName.c_str());
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_ICON_FILE");
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_IDENTIFIER");
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_SHORT_VERSION_STRING");
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_BUNDLE_VERSION");
mf->ConfigureFile(inFile.c_str(), fname, false, false, false);
- mf->PopScope();
}
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index cb66a75a27..3c19f550d1 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -435,7 +435,7 @@ cmMakefile::IncludeScope::~IncludeScope()
this->EnforceCMP0011();
}
}
- this->Makefile->PopPolicyBarrier(this->ReportError);
+ this->Makefile->PopSnapshot(this->ReportError);
this->Makefile->PopFunctionBlockerBarrier(this->ReportError);
}
@@ -549,7 +549,7 @@ public:
~ListFileScope()
{
- this->Makefile->PopPolicyBarrier(this->ReportError);
+ this->Makefile->PopSnapshot(this->ReportError);
this->Makefile->PopFunctionBlockerBarrier(this->ReportError);
}
@@ -1551,7 +1551,7 @@ void cmMakefile::PopFunctionScope(bool reportError)
{
this->PopPolicy();
- this->PopPolicyBarrier(reportError);
+ this->PopSnapshot(reportError);
this->PopFunctionBlockerBarrier(reportError);
@@ -1582,7 +1582,7 @@ void cmMakefile::PushMacroScope(std::string const& fileName,
void cmMakefile::PopMacroScope(bool reportError)
{
this->PopPolicy();
- this->PopPolicyBarrier(reportError);
+ this->PopSnapshot(reportError);
this->PopFunctionBlockerBarrier(reportError);
}
@@ -1619,7 +1619,7 @@ public:
~BuildsystemFileScope()
{
this->Makefile->PopFunctionBlockerBarrier(this->ReportError);
- this->Makefile->PopPolicyBarrier(this->ReportError);
+ this->Makefile->PopSnapshot(this->ReportError);
#if defined(CMAKE_BUILD_WITH_CMAKE)
this->GG->GetFileLockPool().PopFileScope();
#endif
@@ -4233,9 +4233,7 @@ void cmMakefile::PopScope()
this->CheckForUnusedVariables();
- this->StateSnapshot =
- this->GetState()->Pop(this->StateSnapshot);
- assert(this->StateSnapshot.IsValid());
+ this->PopSnapshot();
}
void cmMakefile::RaiseScope(const std::string& var, const char *varDef)
@@ -4601,20 +4599,15 @@ bool cmMakefile::SetPolicy(cmPolicies::PolicyID id,
}
//----------------------------------------------------------------------------
-cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m, bool weak,
- cmPolicies::PolicyMap const& pm):
- Makefile(m), ReportError(true)
+cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m): Makefile(m)
{
- this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState()
- ->CreatePolicyScopeSnapshot(this->Makefile->StateSnapshot);
- this->Makefile->PushPolicy(weak, pm);
+ this->Makefile->PushPolicy();
}
//----------------------------------------------------------------------------
cmMakefile::PolicyPushPop::~PolicyPushPop()
{
this->Makefile->PopPolicy();
- this->Makefile->PopPolicyBarrier(this->ReportError);
}
//----------------------------------------------------------------------------
@@ -4634,8 +4627,11 @@ void cmMakefile::PopPolicy()
}
//----------------------------------------------------------------------------
-void cmMakefile::PopPolicyBarrier(bool reportError)
+void cmMakefile::PopSnapshot(bool reportError)
{
+ // cmState::Snapshot manages nested policy scopes within it.
+ // Since the scope corresponding to the snapshot is closing,
+ // reject any still-open nested policy scopes with an error.
while (!this->StateSnapshot.CanPopPolicyScope())
{
if(reportError)
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 111f07496a..1edffdcd71 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -321,14 +321,10 @@ public:
class PolicyPushPop
{
public:
- PolicyPushPop(cmMakefile* m,
- bool weak = false,
- cmPolicies::PolicyMap const& pm = cmPolicies::PolicyMap());
+ PolicyPushPop(cmMakefile* m);
~PolicyPushPop();
- void Quiet() { this->ReportError = false; }
private:
cmMakefile* Makefile;
- bool ReportError;
};
friend class PolicyPushPop;
@@ -904,7 +900,7 @@ private:
void PushPolicy(bool weak = false,
cmPolicies::PolicyMap const& pm = cmPolicies::PolicyMap());
void PopPolicy();
- void PopPolicyBarrier(bool reportError = true);
+ void PopSnapshot(bool reportError = true);
friend class cmCMakePolicyCommand;
class IncludeScope;
friend class IncludeScope;
diff --git a/Source/cmState.cxx b/Source/cmState.cxx
index 363d2bf5d2..c1ead6c327 100644
--- a/Source/cmState.cxx
+++ b/Source/cmState.cxx
@@ -27,6 +27,7 @@ struct cmState::SnapshotDataType
cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyRoot;
cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyScope;
cmState::SnapshotType SnapshotType;
+ bool Keep;
cmLinkedTree<std::string>::iterator ExecutionListFile;
cmLinkedTree<cmState::BuildsystemDirectoryStateType>::iterator
BuildSystemDirectory;
@@ -288,7 +289,7 @@ cmState::Snapshot cmState::Reset()
assert(pos->Policies.IsValid());
assert(pos->PolicyRoot.IsValid());
this->VarTree.Clear();
- pos->Vars = this->VarTree.Extend(this->VarTree.Root());
+ pos->Vars = this->VarTree.Push(this->VarTree.Root());
pos->Parent = this->VarTree.Root();
pos->Root = this->VarTree.Root();
@@ -751,14 +752,15 @@ void cmState::Directory::ComputeRelativePathTopBinary()
cmState::Snapshot cmState::CreateBaseSnapshot()
{
- PositionType pos = this->SnapshotData.Extend(this->SnapshotData.Root());
+ PositionType pos = this->SnapshotData.Push(this->SnapshotData.Root());
pos->DirectoryParent = this->SnapshotData.Root();
pos->ScopeParent = this->SnapshotData.Root();
pos->SnapshotType = BaseType;
+ pos->Keep = true;
pos->BuildSystemDirectory =
- this->BuildsystemDirectory.Extend(this->BuildsystemDirectory.Root());
+ this->BuildsystemDirectory.Push(this->BuildsystemDirectory.Root());
pos->ExecutionListFile =
- this->ExecutionListFiles.Extend(this->ExecutionListFiles.Root());
+ this->ExecutionListFiles.Push(this->ExecutionListFiles.Root());
pos->IncludeDirectoryPosition = 0;
pos->CompileDefinitionsPosition = 0;
pos->CompileOptionsPosition = 0;
@@ -768,7 +770,7 @@ cmState::Snapshot cmState::CreateBaseSnapshot()
pos->PolicyScope = this->PolicyStack.Root();
assert(pos->Policies.IsValid());
assert(pos->PolicyRoot.IsValid());
- pos->Vars = this->VarTree.Extend(this->VarTree.Root());
+ pos->Vars = this->VarTree.Push(this->VarTree.Root());
assert(pos->Vars.IsValid());
pos->Parent = this->VarTree.Root();
pos->Root = this->VarTree.Root();
@@ -781,17 +783,18 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot,
long entryPointLine)
{
assert(originSnapshot.IsValid());
- PositionType pos = this->SnapshotData.Extend(originSnapshot.Position);
+ PositionType pos = this->SnapshotData.Push(originSnapshot.Position);
pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand;
pos->DirectoryParent = originSnapshot.Position;
pos->ScopeParent = originSnapshot.Position;
pos->SnapshotType = BuildsystemDirectoryType;
+ pos->Keep = true;
pos->BuildSystemDirectory =
- this->BuildsystemDirectory.Extend(
+ this->BuildsystemDirectory.Push(
originSnapshot.Position->BuildSystemDirectory);
pos->ExecutionListFile =
- this->ExecutionListFiles.Extend(
+ this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile);
pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->Policies = originSnapshot.Position->Policies;
@@ -804,7 +807,7 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot,
originSnapshot.Position->Vars;
pos->Parent = origin;
pos->Root = origin;
- pos->Vars = this->VarTree.Extend(origin);
+ pos->Vars = this->VarTree.Push(origin);
cmState::Snapshot snapshot = cmState::Snapshot(this, pos);
originSnapshot.Position->BuildSystemDirectory->Children.push_back(snapshot);
return snapshot;
@@ -816,13 +819,14 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine,
std::string const& fileName)
{
- PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
- *originSnapshot.Position);
+ PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
+ *originSnapshot.Position);
pos->ScopeParent = originSnapshot.Position;
pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = FunctionCallType;
- pos->ExecutionListFile = this->ExecutionListFiles.Extend(
+ pos->Keep = false;
+ pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName);
pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->PolicyScope = originSnapshot.Position->Policies;
@@ -830,7 +834,7 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot,
cmLinkedTree<cmDefinitions>::iterator origin =
originSnapshot.Position->Vars;
pos->Parent = origin;
- pos->Vars = this->VarTree.Extend(origin);
+ pos->Vars = this->VarTree.Push(origin);
return cmState::Snapshot(this, pos);
}
@@ -841,12 +845,13 @@ cmState::CreateMacroCallSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine,
std::string const& fileName)
{
- PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
- *originSnapshot.Position);
+ PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
+ *originSnapshot.Position);
pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = MacroCallType;
- pos->ExecutionListFile = this->ExecutionListFiles.Extend(
+ pos->Keep = false;
+ pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName);
assert(originSnapshot.Position->Vars.IsValid());
pos->BuildSystemDirectory->DirectoryEnd = pos;
@@ -860,12 +865,13 @@ cmState::CreateCallStackSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine,
const std::string& fileName)
{
- PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
- *originSnapshot.Position);
+ PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
+ *originSnapshot.Position);
pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = CallStackType;
- pos->ExecutionListFile = this->ExecutionListFiles.Extend(
+ pos->Keep = true;
+ pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName);
assert(originSnapshot.Position->Vars.IsValid());
pos->BuildSystemDirectory->DirectoryEnd = pos;
@@ -878,18 +884,20 @@ cmState::CreateVariableScopeSnapshot(cmState::Snapshot originSnapshot,
std::string const& entryPointCommand,
long entryPointLine)
{
- PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
- *originSnapshot.Position);
+ PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
+ *originSnapshot.Position);
pos->ScopeParent = originSnapshot.Position;
pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = VariableScopeType;
+ pos->Keep = false;
+ pos->PolicyScope = originSnapshot.Position->Policies;
assert(originSnapshot.Position->Vars.IsValid());
cmLinkedTree<cmDefinitions>::iterator origin =
originSnapshot.Position->Vars;
pos->Parent = origin;
- pos->Vars = this->VarTree.Extend(origin);
+ pos->Vars = this->VarTree.Push(origin);
assert(pos->Vars.IsValid());
return cmState::Snapshot(this, pos);
}
@@ -900,12 +908,13 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine,
const std::string& fileName)
{
- PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
- *originSnapshot.Position);
+ PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
+ *originSnapshot.Position);
pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = InlineListFileType;
- pos->ExecutionListFile = this->ExecutionListFiles.Extend(
+ pos->Keep = true;
+ pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName);
pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->PolicyScope = originSnapshot.Position->Policies;
@@ -915,9 +924,10 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot,
cmState::Snapshot
cmState::CreatePolicyScopeSnapshot(cmState::Snapshot originSnapshot)
{
- PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
- *originSnapshot.Position);
+ PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
+ *originSnapshot.Position);
pos->SnapshotType = PolicyScopeType;
+ pos->Keep = false;
pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->PolicyScope = originSnapshot.Position->Policies;
return cmState::Snapshot(this, pos);
@@ -936,6 +946,21 @@ cmState::Snapshot cmState::Pop(cmState::Snapshot originSnapshot)
prevPos->BuildSystemDirectory->CompileOptions.size();
prevPos->BuildSystemDirectory->DirectoryEnd = prevPos;
+ if (!pos->Keep && this->SnapshotData.IsLast(pos))
+ {
+ if (pos->Vars != prevPos->Vars)
+ {
+ assert(this->VarTree.IsLast(pos->Vars));
+ this->VarTree.Pop(pos->Vars);
+ }
+ if (pos->ExecutionListFile != prevPos->ExecutionListFile)
+ {
+ assert(this->ExecutionListFiles.IsLast(pos->ExecutionListFile));
+ this->ExecutionListFiles.Pop(pos->ExecutionListFile);
+ }
+ this->SnapshotData.Pop(pos);
+ }
+
return Snapshot(this, prevPos);
}
@@ -998,6 +1023,11 @@ void cmState::Directory::SetCurrentBinary(std::string const& dir)
this->ComputeRelativePathTopBinary();
}
+void cmState::Snapshot::Keep()
+{
+ this->Position->Keep = true;
+}
+
void cmState::Snapshot::SetListFile(const std::string& listfile)
{
*this->Position->ExecutionListFile = listfile;
@@ -1112,8 +1142,8 @@ void cmState::Snapshot::PushPolicy(cmPolicies::PolicyMap entry, bool weak)
{
PositionType pos = this->Position;
pos->Policies =
- this->State->PolicyStack.Extend(pos->Policies,
- PolicyStackEntry(entry, weak));
+ this->State->PolicyStack.Push(pos->Policies,
+ PolicyStackEntry(entry, weak));
}
bool cmState::Snapshot::PopPolicy()
@@ -1123,7 +1153,7 @@ bool cmState::Snapshot::PopPolicy()
{
return false;
}
- ++pos->Policies;
+ pos->Policies = this->State->PolicyStack.Pop(pos->Policies);
return true;
}
diff --git a/Source/cmState.h b/Source/cmState.h
index 99e537c07f..a66603f62e 100644
--- a/Source/cmState.h
+++ b/Source/cmState.h
@@ -62,6 +62,7 @@ public:
std::vector<std::string> ClosureKeys() const;
bool RaiseScope(std::string const& var, const char* varDef);
+ void Keep();
void SetListFile(std::string const& listfile);
std::string GetExecutionListFile() const;