Merge branch 'fix-variable_watch-reallocation' into release

This commit is contained in:
Brad King 2016-03-23 16:18:08 -04:00
commit 277b7567f7
3 changed files with 19 additions and 10 deletions

View File

@ -2531,15 +2531,22 @@ const char* cmMakefile::GetDefinition(const std::string& name) const
cmVariableWatch* vv = this->GetVariableWatch(); cmVariableWatch* vv = this->GetVariableWatch();
if ( vv && !this->SuppressWatches ) if ( vv && !this->SuppressWatches )
{ {
if ( def ) bool const watch_function_executed =
{
vv->VariableAccessed(name, cmVariableWatch::VARIABLE_READ_ACCESS,
def, this);
}
else
{
vv->VariableAccessed(name, vv->VariableAccessed(name,
cmVariableWatch::UNKNOWN_VARIABLE_READ_ACCESS, def, this); def ? cmVariableWatch::VARIABLE_READ_ACCESS
: cmVariableWatch::UNKNOWN_VARIABLE_READ_ACCESS,
def, this);
if (watch_function_executed)
{
// A callback was executed and may have caused re-allocation of the
// variable storage. Look it up again for now.
// FIXME: Refactor variable storage to avoid this problem.
def = this->StateSnapshot.GetDefinition(name);
if(!def)
{
def = this->GetState()->GetInitializedCacheValue(name);
}
} }
} }
#endif #endif

View File

@ -96,7 +96,7 @@ void cmVariableWatch::RemoveWatch(const std::string& variable,
} }
} }
void cmVariableWatch::VariableAccessed(const std::string& variable, bool cmVariableWatch::VariableAccessed(const std::string& variable,
int access_type, int access_type,
const char* newValue, const char* newValue,
const cmMakefile* mf) const const cmMakefile* mf) const
@ -112,5 +112,7 @@ void cmVariableWatch::VariableAccessed(const std::string& variable,
(*it)->Method(variable, access_type, (*it)->ClientData, (*it)->Method(variable, access_type, (*it)->ClientData,
newValue, mf); newValue, mf);
} }
return true;
} }
return false;
} }

View File

@ -42,7 +42,7 @@ public:
/** /**
* This method is called when variable is accessed * This method is called when variable is accessed
*/ */
void VariableAccessed(const std::string& variable, int access_type, bool VariableAccessed(const std::string& variable, int access_type,
const char* newValue, const cmMakefile* mf) const; const char* newValue, const cmMakefile* mf) const;
/** /**