Revert "ClearMatches: Only clear matches which were actually set" (#15261)

This reverts commit v3.1.0-rc1~557^2~2 (ClearMatches: Only clear matches
which were actually set, 2014-03-12).  The optimization did not track
the match count in the same scope as the variables, allowing possible
inconsistency.

Resolve conflicts in Source/cmIfCommand.cxx, Source/cmMakefile.cxx,
and Source/cmMakefile.h by moving the changes to the new location
of the code involved.
This commit is contained in:
Ben Boeckel 2014-11-26 12:55:44 -05:00 committed by Brad King
parent d2f2a2e226
commit 7d674b5f0b
5 changed files with 43 additions and 60 deletions

View File

@ -11,6 +11,7 @@
============================================================================*/ ============================================================================*/
#include "cmConditionEvaluator.h" #include "cmConditionEvaluator.h"
#include "cmStringCommand.h"
cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile): cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile):
Makefile(makefile), Makefile(makefile),
@ -555,7 +556,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs,
{ {
def = this->GetVariableOrString(*arg); def = this->GetVariableOrString(*arg);
const char* rex = argP2->c_str(); const char* rex = argP2->c_str();
this->Makefile.ClearMatches(); cmStringCommand::ClearMatches(&this->Makefile);
cmsys::RegularExpression regEntry; cmsys::RegularExpression regEntry;
if ( !regEntry.compile(rex) ) if ( !regEntry.compile(rex) )
{ {
@ -567,7 +568,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs,
} }
if (regEntry.find(def)) if (regEntry.find(def))
{ {
this->Makefile.StoreMatches(regEntry); cmStringCommand::StoreMatches(&this->Makefile, regEntry);
*arg = cmExpandedCommandArgument("1", true); *arg = cmExpandedCommandArgument("1", true);
} }
else else

View File

@ -102,7 +102,6 @@ cmMakefile::cmMakefile(): Internal(new Internals)
this->PreOrder = false; this->PreOrder = false;
this->GeneratingBuildSystem = false; this->GeneratingBuildSystem = false;
this->NumLastMatches = 0;
this->SuppressWatches = false; this->SuppressWatches = false;
} }
@ -153,7 +152,6 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals)
this->ListFileStack = mf.ListFileStack; this->ListFileStack = mf.ListFileStack;
this->OutputToSource = mf.OutputToSource; this->OutputToSource = mf.OutputToSource;
this->NumLastMatches = mf.NumLastMatches;
this->SuppressWatches = mf.SuppressWatches; this->SuppressWatches = mf.SuppressWatches;
} }
@ -4743,51 +4741,6 @@ std::vector<cmSourceFile*> cmMakefile::GetQtUiFilesWithOptions() const
return this->QtUiFilesWithOptions; return this->QtUiFilesWithOptions;
} }
static std::string matchVariables[] = {
"CMAKE_MATCH_0",
"CMAKE_MATCH_1",
"CMAKE_MATCH_2",
"CMAKE_MATCH_3",
"CMAKE_MATCH_4",
"CMAKE_MATCH_5",
"CMAKE_MATCH_6",
"CMAKE_MATCH_7",
"CMAKE_MATCH_8",
"CMAKE_MATCH_9"
};
//----------------------------------------------------------------------------
void cmMakefile::ClearMatches()
{
for (unsigned int i=0; i<this->NumLastMatches; i++)
{
std::string const& var = matchVariables[i];
std::string const& s = this->GetSafeDefinition(var);
if(!s.empty())
{
this->AddDefinition(var, "");
this->MarkVariableAsUsed(var);
}
}
this->NumLastMatches = 0;
}
//----------------------------------------------------------------------------
void cmMakefile::StoreMatches(cmsys::RegularExpression& re)
{
for (unsigned int i=0; i<10; i++)
{
std::string const& m = re.match(i);
if(!m.empty())
{
std::string const& var = matchVariables[i];
this->AddDefinition(var, m.c_str());
this->MarkVariableAsUsed(var);
this->NumLastMatches = i + 1;
}
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmPolicies::PolicyStatus cmPolicies::PolicyStatus
cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id) const cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id) const

View File

@ -942,9 +942,6 @@ public:
std::string const& lhs, std::string const& lhs,
std::string const& rhs); std::string const& rhs);
void ClearMatches();
void StoreMatches(cmsys::RegularExpression& re);
protected: protected:
// add link libraries and directories to the target // add link libraries and directories to the target
void AddGlobalLinkInformation(const std::string& name, cmTarget& target); void AddGlobalLinkInformation(const std::string& name, cmTarget& target);
@ -1150,8 +1147,6 @@ private:
std::vector<cmSourceFile*> QtUiFilesWithOptions; std::vector<cmSourceFile*> QtUiFilesWithOptions;
unsigned int NumLastMatches;
bool AddRequiredTargetCFeature(cmTarget *target, bool AddRequiredTargetCFeature(cmTarget *target,
const std::string& feature) const; const std::string& feature) const;

View File

@ -310,7 +310,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args)
input += args[i]; input += args[i];
} }
this->Makefile->ClearMatches(); this->ClearMatches(this->Makefile);
// Compile the regular expression. // Compile the regular expression.
cmsys::RegularExpression re; cmsys::RegularExpression re;
if(!re.compile(regex.c_str())) if(!re.compile(regex.c_str()))
@ -325,7 +325,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args)
std::string output; std::string output;
if(re.find(input.c_str())) if(re.find(input.c_str()))
{ {
this->Makefile->StoreMatches(re); this->StoreMatches(this->Makefile, re);
std::string::size_type l = re.start(); std::string::size_type l = re.start();
std::string::size_type r = re.end(); std::string::size_type r = re.end();
if(r-l == 0) if(r-l == 0)
@ -359,7 +359,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args)
input += args[i]; input += args[i];
} }
this->Makefile->ClearMatches(); this->ClearMatches(this->Makefile);
// Compile the regular expression. // Compile the regular expression.
cmsys::RegularExpression re; cmsys::RegularExpression re;
if(!re.compile(regex.c_str())) if(!re.compile(regex.c_str()))
@ -376,7 +376,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args)
const char* p = input.c_str(); const char* p = input.c_str();
while(re.find(p)) while(re.find(p))
{ {
this->Makefile->StoreMatches(re); this->StoreMatches(this->Makefile, re);
std::string::size_type l = re.start(); std::string::size_type l = re.start();
std::string::size_type r = re.end(); std::string::size_type r = re.end();
if(r-l == 0) if(r-l == 0)
@ -463,7 +463,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
input += args[i]; input += args[i];
} }
this->Makefile->ClearMatches(); this->ClearMatches(this->Makefile);
// Compile the regular expression. // Compile the regular expression.
cmsys::RegularExpression re; cmsys::RegularExpression re;
if(!re.compile(regex.c_str())) if(!re.compile(regex.c_str()))
@ -480,7 +480,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
std::string::size_type base = 0; std::string::size_type base = 0;
while(re.find(input.c_str()+base)) while(re.find(input.c_str()+base))
{ {
this->Makefile->StoreMatches(re); this->StoreMatches(this->Makefile, re);
std::string::size_type l2 = re.start(); std::string::size_type l2 = re.start();
std::string::size_type r = re.end(); std::string::size_type r = re.end();
@ -540,6 +540,38 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
return true; return true;
} }
//----------------------------------------------------------------------------
void cmStringCommand::ClearMatches(cmMakefile* mf)
{
for (unsigned int i=0; i<10; i++)
{
char name[128];
sprintf(name, "CMAKE_MATCH_%d", i);
const char* s = mf->GetDefinition(name);
if(s && *s != 0)
{
mf->AddDefinition(name, "");
mf->MarkVariableAsUsed(name);
}
}
}
//----------------------------------------------------------------------------
void cmStringCommand::StoreMatches(cmMakefile* mf,cmsys::RegularExpression& re)
{
for (unsigned int i=0; i<10; i++)
{
std::string m = re.match(i);
if(m.size() > 0)
{
char name[128];
sprintf(name, "CMAKE_MATCH_%d", i);
mf->AddDefinition(name, re.match(i).c_str());
mf->MarkVariableAsUsed(name);
}
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmStringCommand::HandleFindCommand(std::vector<std::string> const& bool cmStringCommand::HandleFindCommand(std::vector<std::string> const&
args) args)

View File

@ -53,6 +53,8 @@ public:
virtual std::string GetName() const { return "string";} virtual std::string GetName() const { return "string";}
cmTypeMacro(cmStringCommand, cmCommand); cmTypeMacro(cmStringCommand, cmCommand);
static void ClearMatches(cmMakefile* mf);
static void StoreMatches(cmMakefile* mf, cmsys::RegularExpression& re);
protected: protected:
bool HandleConfigureCommand(std::vector<std::string> const& args); bool HandleConfigureCommand(std::vector<std::string> const& args);
bool HandleAsciiCommand(std::vector<std::string> const& args); bool HandleAsciiCommand(std::vector<std::string> const& args);