Merge branch 'fix-variable_watch-reallocation' into release
This commit is contained in:
commit
277b7567f7
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user