Merge branch 'reduce-cmState-accumulation' into reduce-cmState-accumulation-for-master

This commit is contained in:
Brad King 2015-11-25 12:33:06 -05:00
commit 9342a4c203
8 changed files with 121 additions and 66 deletions

View File

@ -24,7 +24,7 @@
needs of the cmState. For example, the Truncate() method is a specific needs of the cmState. For example, the Truncate() method is a specific
requirement of the cmState. 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 each of which return iterators. A Tree can be built up by extending
from the root, and then extending from any other iterator. from the root, and then extending from any other iterator.
@ -142,14 +142,35 @@ public:
return iterator(const_cast<cmLinkedTree*>(this), 0); 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() iterator Truncate()
@ -179,7 +200,7 @@ private:
return &this->Data[pos]; 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(this->UpPositions.size() == this->Data.size());
assert(it.Position <= this->UpPositions.size()); assert(it.Position <= this->UpPositions.size());

View File

@ -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 void cmListFileBacktrace::PrintTitle(std::ostream& out) const
{ {
if (!this->Snapshot.IsValid()) if (!this->Snapshot.IsValid())

View File

@ -90,10 +90,8 @@ class cmListFileBacktrace
{ {
public: public:
cmListFileBacktrace(cmState::Snapshot snapshot = cmState::Snapshot(), cmListFileBacktrace(cmState::Snapshot snapshot = cmState::Snapshot(),
cmCommandContext const& cc = cmCommandContext()) cmCommandContext const& cc = cmCommandContext());
: Context(cc), Snapshot(snapshot) ~cmListFileBacktrace();
{
}
void PrintTitle(std::ostream& out) const; void PrintTitle(std::ostream& out) const;
void PrintCallStack(std::ostream& out) const; void PrintCallStack(std::ostream& out) const;

View File

@ -3121,7 +3121,7 @@ void cmLocalGenerator::GenerateAppleInfoPList(cmGeneratorTarget* target,
// override user make variables. If not the configuration will fall // override user make variables. If not the configuration will fall
// back to the directory-level values set by the user. // back to the directory-level values set by the user.
cmMakefile* mf = this->Makefile; cmMakefile* mf = this->Makefile;
mf->PushScope(); cmMakefile::ScopePushPop varScope(mf);
mf->AddDefinition("MACOSX_BUNDLE_EXECUTABLE_NAME", targetName.c_str()); mf->AddDefinition("MACOSX_BUNDLE_EXECUTABLE_NAME", targetName.c_str());
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_INFO_STRING"); cmLGInfoProp(mf, target, "MACOSX_BUNDLE_INFO_STRING");
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_ICON_FILE"); cmLGInfoProp(mf, target, "MACOSX_BUNDLE_ICON_FILE");
@ -3132,7 +3132,6 @@ void cmLocalGenerator::GenerateAppleInfoPList(cmGeneratorTarget* target,
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_BUNDLE_VERSION"); cmLGInfoProp(mf, target, "MACOSX_BUNDLE_BUNDLE_VERSION");
cmLGInfoProp(mf, target, "MACOSX_BUNDLE_COPYRIGHT"); cmLGInfoProp(mf, target, "MACOSX_BUNDLE_COPYRIGHT");
mf->ConfigureFile(inFile.c_str(), fname, false, false, false); mf->ConfigureFile(inFile.c_str(), fname, false, false, false);
mf->PopScope();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -3165,12 +3164,11 @@ void cmLocalGenerator::GenerateFrameworkInfoPList(cmGeneratorTarget* target,
// override user make variables. If not the configuration will fall // override user make variables. If not the configuration will fall
// back to the directory-level values set by the user. // back to the directory-level values set by the user.
cmMakefile* mf = this->Makefile; cmMakefile* mf = this->Makefile;
mf->PushScope(); cmMakefile::ScopePushPop varScope(mf);
mf->AddDefinition("MACOSX_FRAMEWORK_NAME", targetName.c_str()); mf->AddDefinition("MACOSX_FRAMEWORK_NAME", targetName.c_str());
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_ICON_FILE"); cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_ICON_FILE");
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_IDENTIFIER"); cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_IDENTIFIER");
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_SHORT_VERSION_STRING"); cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_SHORT_VERSION_STRING");
cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_BUNDLE_VERSION"); cmLGInfoProp(mf, target, "MACOSX_FRAMEWORK_BUNDLE_VERSION");
mf->ConfigureFile(inFile.c_str(), fname, false, false, false); mf->ConfigureFile(inFile.c_str(), fname, false, false, false);
mf->PopScope();
} }

View File

@ -391,7 +391,7 @@ cmMakefile::IncludeScope::~IncludeScope()
this->EnforceCMP0011(); this->EnforceCMP0011();
} }
} }
this->Makefile->PopPolicyBarrier(this->ReportError); this->Makefile->PopSnapshot(this->ReportError);
this->Makefile->PopFunctionBlockerBarrier(this->ReportError); this->Makefile->PopFunctionBlockerBarrier(this->ReportError);
} }
@ -505,7 +505,7 @@ public:
~ListFileScope() ~ListFileScope()
{ {
this->Makefile->PopPolicyBarrier(this->ReportError); this->Makefile->PopSnapshot(this->ReportError);
this->Makefile->PopFunctionBlockerBarrier(this->ReportError); this->Makefile->PopFunctionBlockerBarrier(this->ReportError);
} }
@ -1534,7 +1534,7 @@ void cmMakefile::PopFunctionScope(bool reportError)
{ {
this->PopPolicy(); this->PopPolicy();
this->PopPolicyBarrier(reportError); this->PopSnapshot(reportError);
this->PopFunctionBlockerBarrier(reportError); this->PopFunctionBlockerBarrier(reportError);
@ -1565,7 +1565,7 @@ void cmMakefile::PushMacroScope(std::string const& fileName,
void cmMakefile::PopMacroScope(bool reportError) void cmMakefile::PopMacroScope(bool reportError)
{ {
this->PopPolicy(); this->PopPolicy();
this->PopPolicyBarrier(reportError); this->PopSnapshot(reportError);
this->PopFunctionBlockerBarrier(reportError); this->PopFunctionBlockerBarrier(reportError);
} }
@ -1602,7 +1602,7 @@ public:
~BuildsystemFileScope() ~BuildsystemFileScope()
{ {
this->Makefile->PopFunctionBlockerBarrier(this->ReportError); this->Makefile->PopFunctionBlockerBarrier(this->ReportError);
this->Makefile->PopPolicyBarrier(this->ReportError); this->Makefile->PopSnapshot(this->ReportError);
#if defined(CMAKE_BUILD_WITH_CMAKE) #if defined(CMAKE_BUILD_WITH_CMAKE)
this->GG->GetFileLockPool().PopFileScope(); this->GG->GetFileLockPool().PopFileScope();
#endif #endif
@ -4168,9 +4168,7 @@ void cmMakefile::PopScope()
this->CheckForUnusedVariables(); this->CheckForUnusedVariables();
this->StateSnapshot = this->PopSnapshot();
this->GetState()->Pop(this->StateSnapshot);
assert(this->StateSnapshot.IsValid());
} }
void cmMakefile::RaiseScope(const std::string& var, const char *varDef) void cmMakefile::RaiseScope(const std::string& var, const char *varDef)
@ -4521,20 +4519,15 @@ bool cmMakefile::SetPolicy(cmPolicies::PolicyID id,
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m, bool weak, cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m): Makefile(m)
cmPolicies::PolicyMap const& pm):
Makefile(m), ReportError(true)
{ {
this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() this->Makefile->PushPolicy();
->CreatePolicyScopeSnapshot(this->Makefile->StateSnapshot);
this->Makefile->PushPolicy(weak, pm);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmMakefile::PolicyPushPop::~PolicyPushPop() cmMakefile::PolicyPushPop::~PolicyPushPop()
{ {
this->Makefile->PopPolicy(); this->Makefile->PopPolicy();
this->Makefile->PopPolicyBarrier(this->ReportError);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -4554,8 +4547,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()) while (!this->StateSnapshot.CanPopPolicyScope())
{ {
if(reportError) if(reportError)

View File

@ -315,14 +315,10 @@ public:
class PolicyPushPop class PolicyPushPop
{ {
public: public:
PolicyPushPop(cmMakefile* m, PolicyPushPop(cmMakefile* m);
bool weak = false,
cmPolicies::PolicyMap const& pm = cmPolicies::PolicyMap());
~PolicyPushPop(); ~PolicyPushPop();
void Quiet() { this->ReportError = false; }
private: private:
cmMakefile* Makefile; cmMakefile* Makefile;
bool ReportError;
}; };
friend class PolicyPushPop; friend class PolicyPushPop;
@ -878,7 +874,7 @@ private:
void PushPolicy(bool weak = false, void PushPolicy(bool weak = false,
cmPolicies::PolicyMap const& pm = cmPolicies::PolicyMap()); cmPolicies::PolicyMap const& pm = cmPolicies::PolicyMap());
void PopPolicy(); void PopPolicy();
void PopPolicyBarrier(bool reportError = true); void PopSnapshot(bool reportError = true);
friend class cmCMakePolicyCommand; friend class cmCMakePolicyCommand;
class IncludeScope; class IncludeScope;
friend class IncludeScope; friend class IncludeScope;

View File

@ -28,6 +28,7 @@ struct cmState::SnapshotDataType
cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyRoot; cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyRoot;
cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyScope; cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyScope;
cmState::SnapshotType SnapshotType; cmState::SnapshotType SnapshotType;
bool Keep;
cmLinkedTree<std::string>::iterator ExecutionListFile; cmLinkedTree<std::string>::iterator ExecutionListFile;
cmLinkedTree<cmState::BuildsystemDirectoryStateType>::iterator cmLinkedTree<cmState::BuildsystemDirectoryStateType>::iterator
BuildSystemDirectory; BuildSystemDirectory;
@ -341,7 +342,7 @@ cmState::Snapshot cmState::Reset()
std::string binDir = std::string binDir =
cmDefinitions::Get("CMAKE_BINARY_DIR", pos->Vars, pos->Root); cmDefinitions::Get("CMAKE_BINARY_DIR", pos->Vars, pos->Root);
this->VarTree.Clear(); 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->Parent = this->VarTree.Root();
pos->Root = this->VarTree.Root(); pos->Root = this->VarTree.Root();
@ -818,14 +819,15 @@ void cmState::Directory::ComputeRelativePathTopBinary()
cmState::Snapshot cmState::CreateBaseSnapshot() 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->DirectoryParent = this->SnapshotData.Root();
pos->ScopeParent = this->SnapshotData.Root(); pos->ScopeParent = this->SnapshotData.Root();
pos->SnapshotType = BaseType; pos->SnapshotType = BaseType;
pos->Keep = true;
pos->BuildSystemDirectory = pos->BuildSystemDirectory =
this->BuildsystemDirectory.Extend(this->BuildsystemDirectory.Root()); this->BuildsystemDirectory.Push(this->BuildsystemDirectory.Root());
pos->ExecutionListFile = pos->ExecutionListFile =
this->ExecutionListFiles.Extend(this->ExecutionListFiles.Root()); this->ExecutionListFiles.Push(this->ExecutionListFiles.Root());
pos->IncludeDirectoryPosition = 0; pos->IncludeDirectoryPosition = 0;
pos->CompileDefinitionsPosition = 0; pos->CompileDefinitionsPosition = 0;
pos->CompileOptionsPosition = 0; pos->CompileOptionsPosition = 0;
@ -835,7 +837,7 @@ cmState::Snapshot cmState::CreateBaseSnapshot()
pos->PolicyScope = this->PolicyStack.Root(); pos->PolicyScope = this->PolicyStack.Root();
assert(pos->Policies.IsValid()); assert(pos->Policies.IsValid());
assert(pos->PolicyRoot.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()); assert(pos->Vars.IsValid());
pos->Parent = this->VarTree.Root(); pos->Parent = this->VarTree.Root();
pos->Root = this->VarTree.Root(); pos->Root = this->VarTree.Root();
@ -848,17 +850,18 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot,
long entryPointLine) long entryPointLine)
{ {
assert(originSnapshot.IsValid()); assert(originSnapshot.IsValid());
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position); PositionType pos = this->SnapshotData.Push(originSnapshot.Position);
pos->EntryPointLine = entryPointLine; pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand; pos->EntryPointCommand = entryPointCommand;
pos->DirectoryParent = originSnapshot.Position; pos->DirectoryParent = originSnapshot.Position;
pos->ScopeParent = originSnapshot.Position; pos->ScopeParent = originSnapshot.Position;
pos->SnapshotType = BuildsystemDirectoryType; pos->SnapshotType = BuildsystemDirectoryType;
pos->Keep = true;
pos->BuildSystemDirectory = pos->BuildSystemDirectory =
this->BuildsystemDirectory.Extend( this->BuildsystemDirectory.Push(
originSnapshot.Position->BuildSystemDirectory); originSnapshot.Position->BuildSystemDirectory);
pos->ExecutionListFile = pos->ExecutionListFile =
this->ExecutionListFiles.Extend( this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile); originSnapshot.Position->ExecutionListFile);
pos->BuildSystemDirectory->DirectoryEnd = pos; pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->Policies = originSnapshot.Position->Policies; pos->Policies = originSnapshot.Position->Policies;
@ -871,7 +874,7 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot,
originSnapshot.Position->Vars; originSnapshot.Position->Vars;
pos->Parent = origin; pos->Parent = origin;
pos->Root = origin; pos->Root = origin;
pos->Vars = this->VarTree.Extend(origin); pos->Vars = this->VarTree.Push(origin);
cmState::Snapshot snapshot = cmState::Snapshot(this, pos); cmState::Snapshot snapshot = cmState::Snapshot(this, pos);
originSnapshot.Position->BuildSystemDirectory->Children.push_back(snapshot); originSnapshot.Position->BuildSystemDirectory->Children.push_back(snapshot);
@ -887,13 +890,14 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine, long entryPointLine,
std::string const& fileName) std::string const& fileName)
{ {
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
*originSnapshot.Position); *originSnapshot.Position);
pos->ScopeParent = originSnapshot.Position; pos->ScopeParent = originSnapshot.Position;
pos->EntryPointLine = entryPointLine; pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand; pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = FunctionCallType; pos->SnapshotType = FunctionCallType;
pos->ExecutionListFile = this->ExecutionListFiles.Extend( pos->Keep = false;
pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName); originSnapshot.Position->ExecutionListFile, fileName);
pos->BuildSystemDirectory->DirectoryEnd = pos; pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->PolicyScope = originSnapshot.Position->Policies; pos->PolicyScope = originSnapshot.Position->Policies;
@ -901,7 +905,7 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot,
cmLinkedTree<cmDefinitions>::iterator origin = cmLinkedTree<cmDefinitions>::iterator origin =
originSnapshot.Position->Vars; originSnapshot.Position->Vars;
pos->Parent = origin; pos->Parent = origin;
pos->Vars = this->VarTree.Extend(origin); pos->Vars = this->VarTree.Push(origin);
return cmState::Snapshot(this, pos); return cmState::Snapshot(this, pos);
} }
@ -912,12 +916,13 @@ cmState::CreateMacroCallSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine, long entryPointLine,
std::string const& fileName) std::string const& fileName)
{ {
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
*originSnapshot.Position); *originSnapshot.Position);
pos->EntryPointLine = entryPointLine; pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand; pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = MacroCallType; pos->SnapshotType = MacroCallType;
pos->ExecutionListFile = this->ExecutionListFiles.Extend( pos->Keep = false;
pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName); originSnapshot.Position->ExecutionListFile, fileName);
assert(originSnapshot.Position->Vars.IsValid()); assert(originSnapshot.Position->Vars.IsValid());
pos->BuildSystemDirectory->DirectoryEnd = pos; pos->BuildSystemDirectory->DirectoryEnd = pos;
@ -931,12 +936,13 @@ cmState::CreateCallStackSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine, long entryPointLine,
const std::string& fileName) const std::string& fileName)
{ {
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
*originSnapshot.Position); *originSnapshot.Position);
pos->EntryPointLine = entryPointLine; pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand; pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = CallStackType; pos->SnapshotType = CallStackType;
pos->ExecutionListFile = this->ExecutionListFiles.Extend( pos->Keep = true;
pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName); originSnapshot.Position->ExecutionListFile, fileName);
assert(originSnapshot.Position->Vars.IsValid()); assert(originSnapshot.Position->Vars.IsValid());
pos->BuildSystemDirectory->DirectoryEnd = pos; pos->BuildSystemDirectory->DirectoryEnd = pos;
@ -949,18 +955,20 @@ cmState::CreateVariableScopeSnapshot(cmState::Snapshot originSnapshot,
std::string const& entryPointCommand, std::string const& entryPointCommand,
long entryPointLine) long entryPointLine)
{ {
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
*originSnapshot.Position); *originSnapshot.Position);
pos->ScopeParent = originSnapshot.Position; pos->ScopeParent = originSnapshot.Position;
pos->EntryPointLine = entryPointLine; pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand; pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = VariableScopeType; pos->SnapshotType = VariableScopeType;
pos->Keep = false;
pos->PolicyScope = originSnapshot.Position->Policies;
assert(originSnapshot.Position->Vars.IsValid()); assert(originSnapshot.Position->Vars.IsValid());
cmLinkedTree<cmDefinitions>::iterator origin = cmLinkedTree<cmDefinitions>::iterator origin =
originSnapshot.Position->Vars; originSnapshot.Position->Vars;
pos->Parent = origin; pos->Parent = origin;
pos->Vars = this->VarTree.Extend(origin); pos->Vars = this->VarTree.Push(origin);
assert(pos->Vars.IsValid()); assert(pos->Vars.IsValid());
return cmState::Snapshot(this, pos); return cmState::Snapshot(this, pos);
} }
@ -971,12 +979,13 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot,
long entryPointLine, long entryPointLine,
const std::string& fileName) const std::string& fileName)
{ {
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
*originSnapshot.Position); *originSnapshot.Position);
pos->EntryPointLine = entryPointLine; pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand; pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = InlineListFileType; pos->SnapshotType = InlineListFileType;
pos->ExecutionListFile = this->ExecutionListFiles.Extend( pos->Keep = true;
pos->ExecutionListFile = this->ExecutionListFiles.Push(
originSnapshot.Position->ExecutionListFile, fileName); originSnapshot.Position->ExecutionListFile, fileName);
pos->BuildSystemDirectory->DirectoryEnd = pos; pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->PolicyScope = originSnapshot.Position->Policies; pos->PolicyScope = originSnapshot.Position->Policies;
@ -986,9 +995,10 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot,
cmState::Snapshot cmState::Snapshot
cmState::CreatePolicyScopeSnapshot(cmState::Snapshot originSnapshot) cmState::CreatePolicyScopeSnapshot(cmState::Snapshot originSnapshot)
{ {
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, PositionType pos = this->SnapshotData.Push(originSnapshot.Position,
*originSnapshot.Position); *originSnapshot.Position);
pos->SnapshotType = PolicyScopeType; pos->SnapshotType = PolicyScopeType;
pos->Keep = false;
pos->BuildSystemDirectory->DirectoryEnd = pos; pos->BuildSystemDirectory->DirectoryEnd = pos;
pos->PolicyScope = originSnapshot.Position->Policies; pos->PolicyScope = originSnapshot.Position->Policies;
return cmState::Snapshot(this, pos); return cmState::Snapshot(this, pos);
@ -1007,6 +1017,21 @@ cmState::Snapshot cmState::Pop(cmState::Snapshot originSnapshot)
prevPos->BuildSystemDirectory->CompileOptions.size(); prevPos->BuildSystemDirectory->CompileOptions.size();
prevPos->BuildSystemDirectory->DirectoryEnd = prevPos; 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); return Snapshot(this, prevPos);
} }
@ -1073,6 +1098,11 @@ void cmState::Directory::SetCurrentBinary(std::string const& dir)
this->Snapshot_.SetDefinition("CMAKE_CURRENT_BINARY_DIR", loc.c_str()); this->Snapshot_.SetDefinition("CMAKE_CURRENT_BINARY_DIR", loc.c_str());
} }
void cmState::Snapshot::Keep()
{
this->Position->Keep = true;
}
void cmState::Snapshot::SetListFile(const std::string& listfile) void cmState::Snapshot::SetListFile(const std::string& listfile)
{ {
*this->Position->ExecutionListFile = listfile; *this->Position->ExecutionListFile = listfile;
@ -1187,7 +1217,7 @@ void cmState::Snapshot::PushPolicy(cmPolicies::PolicyMap entry, bool weak)
{ {
PositionType pos = this->Position; PositionType pos = this->Position;
pos->Policies = pos->Policies =
this->State->PolicyStack.Extend(pos->Policies, this->State->PolicyStack.Push(pos->Policies,
PolicyStackEntry(entry, weak)); PolicyStackEntry(entry, weak));
} }
@ -1198,7 +1228,7 @@ bool cmState::Snapshot::PopPolicy()
{ {
return false; return false;
} }
++pos->Policies; pos->Policies = this->State->PolicyStack.Pop(pos->Policies);
return true; return true;
} }

View File

@ -63,6 +63,7 @@ public:
std::vector<std::string> ClosureKeys() const; std::vector<std::string> ClosureKeys() const;
bool RaiseScope(std::string const& var, const char* varDef); bool RaiseScope(std::string const& var, const char* varDef);
void Keep();
void SetListFile(std::string const& listfile); void SetListFile(std::string const& listfile);
std::string GetExecutionListFile() const; std::string GetExecutionListFile() const;