cmState: Add a VariableScope snapshot type.

Match the scopes currently used in cmMakefile for definitions.
This commit is contained in:
Stephen Kelly 2015-08-01 19:41:26 +02:00
parent 1fc645bd9c
commit 6954c8936f
3 changed files with 38 additions and 1 deletions

View File

@ -4464,6 +4464,17 @@ void cmMakefile::PushScope()
{ {
this->Internal->PushDefinitions(Internals::VariableScope); this->Internal->PushDefinitions(Internals::VariableScope);
std::string commandName;
long line = 0;
if (!this->ContextStack.empty())
{
commandName = this->ContextStack.back()->Name;
line = this->ContextStack.back()->Line;
}
this->StateSnapshot = this->GetState()->CreateVariableScopeSnapshot(
this->StateSnapshot,
commandName,
line);
this->PushLoopBlockBarrier(); this->PushLoopBlockBarrier();
#if defined(CMAKE_BUILD_WITH_CMAKE) #if defined(CMAKE_BUILD_WITH_CMAKE)
@ -4482,6 +4493,9 @@ void cmMakefile::PopScope()
this->CheckForUnusedVariables(); this->CheckForUnusedVariables();
this->Internal->PopDefinitions(); this->Internal->PopDefinitions();
this->StateSnapshot =
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)

View File

@ -20,6 +20,7 @@
struct cmState::SnapshotDataType struct cmState::SnapshotDataType
{ {
cmState::PositionType ScopeParent;
cmState::PositionType DirectoryParent; cmState::PositionType DirectoryParent;
cmLinkedTree<cmState::PolicyStackEntry>::iterator Policies; cmLinkedTree<cmState::PolicyStackEntry>::iterator Policies;
cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyRoot; cmLinkedTree<cmState::PolicyStackEntry>::iterator PolicyRoot;
@ -736,6 +737,7 @@ cmState::Snapshot cmState::CreateBaseSnapshot()
{ {
PositionType pos = this->SnapshotData.Extend(this->SnapshotData.Root()); PositionType pos = this->SnapshotData.Extend(this->SnapshotData.Root());
pos->DirectoryParent = this->SnapshotData.Root(); pos->DirectoryParent = this->SnapshotData.Root();
pos->ScopeParent = this->SnapshotData.Root();
pos->SnapshotType = BaseType; pos->SnapshotType = BaseType;
pos->BuildSystemDirectory = pos->BuildSystemDirectory =
this->BuildsystemDirectory.Extend(this->BuildsystemDirectory.Root()); this->BuildsystemDirectory.Extend(this->BuildsystemDirectory.Root());
@ -763,6 +765,7 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot,
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->SnapshotType = BuildsystemDirectoryType; pos->SnapshotType = BuildsystemDirectoryType;
pos->BuildSystemDirectory = pos->BuildSystemDirectory =
this->BuildsystemDirectory.Extend( this->BuildsystemDirectory.Extend(
@ -787,6 +790,7 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot,
{ {
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
*originSnapshot.Position); *originSnapshot.Position);
pos->ScopeParent = originSnapshot.Position;
pos->EntryPointLine = entryPointLine; pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand; pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = FunctionCallType; pos->SnapshotType = FunctionCallType;
@ -834,6 +838,21 @@ cmState::CreateCallStackSnapshot(cmState::Snapshot originSnapshot,
return cmState::Snapshot(this, pos); return cmState::Snapshot(this, pos);
} }
cmState::Snapshot
cmState::CreateVariableScopeSnapshot(cmState::Snapshot originSnapshot,
std::string const& entryPointCommand,
long entryPointLine)
{
PositionType pos = this->SnapshotData.Extend(originSnapshot.Position,
*originSnapshot.Position);
pos->ScopeParent = originSnapshot.Position;
pos->EntryPointLine = entryPointLine;
pos->EntryPointCommand = entryPointCommand;
pos->SnapshotType = VariableScopeType;
return cmState::Snapshot(this, pos);
}
cmState::Snapshot cmState::Snapshot
cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot, cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot,
const std::string& entryPointCommand, const std::string& entryPointCommand,

View File

@ -41,7 +41,8 @@ public:
MacroCallType, MacroCallType,
CallStackType, CallStackType,
InlineListFileType, InlineListFileType,
PolicyScopeType PolicyScopeType,
VariableScopeType
}; };
class Directory; class Directory;
@ -155,6 +156,9 @@ public:
std::string const& entryPointCommand, std::string const& entryPointCommand,
long entryPointLine, long entryPointLine,
std::string const& fileName); std::string const& fileName);
Snapshot CreateVariableScopeSnapshot(Snapshot originSnapshot,
std::string const& entryPointCommand,
long entryPointLine);
Snapshot CreateInlineListFileSnapshot(Snapshot originSnapshot, Snapshot CreateInlineListFileSnapshot(Snapshot originSnapshot,
const std::string& entryPointCommand, const std::string& entryPointCommand,
long entryPointLine, long entryPointLine,