summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-09-16 13:51:47 (GMT)
committerBrad King <brad.king@kitware.com>2009-09-16 13:51:47 (GMT)
commit24861459b59ea61dd920971bc8ddc9bbbd04242e (patch)
tree9f8a410162d1aab0da2c93592196725ea5f1d381 /Source
parent2c8e929a703e94c726bd5cc465789e911a9bf18d (diff)
downloadCMake-24861459b59ea61dd920971bc8ddc9bbbd04242e.zip
CMake-24861459b59ea61dd920971bc8ddc9bbbd04242e.tar.gz
CMake-24861459b59ea61dd920971bc8ddc9bbbd04242e.tar.bz2
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.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmMakefile.cxx12
1 files changed, 10 insertions, 2 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 8233fef..1ebf06e 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -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);
+ }
}