Initialize directory scope with closure of parent

The commit "Improve dynamic variable scope implementation" optimized
function scopes using an efficient parent scope pointer.  However, the
parent scope used to initialize a new directory might not exist later
(like add_subdirectory called inside a function of the parent scope).
This caused CMake to crash when following the dangling pointer to the
original parent scope.

We fix the problem in this commit by always computing the closure of the
parent scope at directory initialization time so that no parent scope
pointer is needed.  See issue #9538.
This commit is contained in:
Brad King 2009-09-16 09:51:47 -04:00
parent 2c8e929a70
commit 24861459b5
1 changed files with 10 additions and 2 deletions

View File

@ -1428,8 +1428,8 @@ void cmMakefile::InitializeFromParent()
{
cmMakefile *parent = this->LocalGenerator->GetParent()->GetMakefile();
// copy the definitions
this->Internal->VarStack.top().Reset(&parent->Internal->VarStack.top());
// Initialize definitions with the closure of the parent scope.
this->Internal->VarStack.top() = parent->Internal->VarStack.top().Closure();
// copy include paths
this->IncludeDirectories = parent->IncludeDirectories;
@ -3422,6 +3422,14 @@ void cmMakefile::RaiseScope(const char *var, const char *varDef)
// Now update the definition in the parent scope.
up->Set(var, varDef);
}
else if(cmMakefile* parent =
this->LocalGenerator->GetParent()->GetMakefile())
{
// Update the definition in the parent directory top scope. This
// directory's scope was initialized by the closure of the parent
// scope, so we do not need to localize the definition first.
parent->Internal->VarStack.top().Set(var, varDef);
}
}