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:
parent
d2f2a2e226
commit
7d674b5f0b
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue