mirror of
https://github.com/reactos/CMake.git
synced 2024-11-28 05:50:42 +00:00
BUG: fix memory leak and cleanup error string code
This commit is contained in:
parent
3cc9efceb7
commit
52d8b1b5d9
@ -76,15 +76,15 @@ IsFunctionBlocked(const cmListFileFunction& lff,
|
||||
}
|
||||
else
|
||||
{
|
||||
char* errorString = 0;
|
||||
std::string errorString;
|
||||
|
||||
std::vector<std::string> expandedArguments;
|
||||
mf.ExpandArguments(this->Functions[c].Arguments,
|
||||
expandedArguments);
|
||||
bool isTrue =
|
||||
cmIfCommand::IsTrue(expandedArguments,&errorString,&mf);
|
||||
cmIfCommand::IsTrue(expandedArguments,errorString,&mf);
|
||||
|
||||
if (errorString)
|
||||
if (errorString.size())
|
||||
{
|
||||
std::string err = "had incorrect arguments: ";
|
||||
unsigned int i;
|
||||
@ -99,7 +99,6 @@ IsFunctionBlocked(const cmListFileFunction& lff,
|
||||
err += errorString;
|
||||
err += ").";
|
||||
cmSystemTools::Error(err.c_str());
|
||||
delete [] errorString;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -183,14 +182,14 @@ bool cmIfCommand
|
||||
::InvokeInitialPass(const std::vector<cmListFileArgument>& args,
|
||||
cmExecutionStatus &)
|
||||
{
|
||||
char* errorString = 0;
|
||||
std::string errorString;
|
||||
|
||||
std::vector<std::string> expandedArguments;
|
||||
this->Makefile->ExpandArguments(args, expandedArguments);
|
||||
bool isTrue =
|
||||
cmIfCommand::IsTrue(expandedArguments,&errorString,this->Makefile);
|
||||
cmIfCommand::IsTrue(expandedArguments,errorString,this->Makefile);
|
||||
|
||||
if (errorString)
|
||||
if (errorString.size())
|
||||
{
|
||||
std::string err = "had incorrect arguments: ";
|
||||
unsigned int i;
|
||||
@ -205,7 +204,6 @@ bool cmIfCommand
|
||||
err += errorString;
|
||||
err += ").";
|
||||
this->SetError(err.c_str());
|
||||
delete [] errorString;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -290,7 +288,7 @@ namespace
|
||||
// level 0 processes parenthetical expressions
|
||||
bool HandleLevel0(std::list<std::string> &newArgs,
|
||||
cmMakefile *makefile,
|
||||
char **errorString)
|
||||
std::string &errorString)
|
||||
{
|
||||
int reducible;
|
||||
do
|
||||
@ -320,11 +318,7 @@ namespace
|
||||
}
|
||||
if (depth)
|
||||
{
|
||||
cmOStringStream error;
|
||||
error << "mismatched parenthesis in condition";
|
||||
delete [] *errorString;
|
||||
*errorString = new char[error.str().size() + 1];
|
||||
strcpy(*errorString, error.str().c_str());
|
||||
errorString = "mismatched parenthesis in condition";
|
||||
return false;
|
||||
}
|
||||
// store the reduced args in this vector
|
||||
@ -365,7 +359,7 @@ namespace
|
||||
// level one handles most predicates except for NOT
|
||||
bool HandleLevel1(std::list<std::string> &newArgs,
|
||||
cmMakefile *makefile,
|
||||
char **)
|
||||
std::string &)
|
||||
{
|
||||
int reducible;
|
||||
do
|
||||
@ -442,7 +436,7 @@ namespace
|
||||
// level two handles most binary operations except for AND OR
|
||||
bool HandleLevel2(std::list<std::string> &newArgs,
|
||||
cmMakefile *makefile,
|
||||
char **errorString)
|
||||
std::string &errorString)
|
||||
{
|
||||
int reducible;
|
||||
const char *def;
|
||||
@ -468,9 +462,7 @@ namespace
|
||||
{
|
||||
cmOStringStream error;
|
||||
error << "Regular expression \"" << rex << "\" cannot compile";
|
||||
delete [] *errorString;
|
||||
*errorString = new char[error.str().size() + 1];
|
||||
strcpy(*errorString, error.str().c_str());
|
||||
errorString = error.str();
|
||||
return false;
|
||||
}
|
||||
if (regEntry.find(def))
|
||||
@ -577,7 +569,7 @@ namespace
|
||||
// level 3 handles NOT
|
||||
bool HandleLevel3(std::list<std::string> &newArgs,
|
||||
cmMakefile *makefile,
|
||||
char **)
|
||||
std::string &)
|
||||
{
|
||||
int reducible;
|
||||
const char *def;
|
||||
@ -608,7 +600,7 @@ namespace
|
||||
// level 4 handles AND OR
|
||||
bool HandleLevel4(std::list<std::string> &newArgs,
|
||||
cmMakefile *makefile,
|
||||
char **)
|
||||
std::string &)
|
||||
{
|
||||
int reducible;
|
||||
const char *def;
|
||||
@ -669,19 +661,14 @@ namespace
|
||||
|
||||
|
||||
bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
||||
char **errorString, cmMakefile *makefile)
|
||||
std::string &errorString, cmMakefile *makefile)
|
||||
{
|
||||
// check for the different signatures
|
||||
const char *def;
|
||||
const char* msg = "Unknown arguments specified";
|
||||
*errorString = new char[strlen(msg) + 1];
|
||||
strcpy(*errorString, msg);
|
||||
errorString = "";
|
||||
|
||||
// handle empty invocation
|
||||
if (args.size() < 1)
|
||||
{
|
||||
delete [] *errorString;
|
||||
*errorString = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -720,8 +707,6 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
||||
// now at the end there should only be one argument left
|
||||
if (newArgs.size() == 1)
|
||||
{
|
||||
delete [] *errorString;
|
||||
*errorString = 0;
|
||||
if (*newArgs.begin() == "0")
|
||||
{
|
||||
return false;
|
||||
@ -736,7 +721,12 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
errorString = "Unknown arguments specified";
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -184,7 +184,7 @@ public:
|
||||
// arguments were valid, and if so, was the response true. If there is
|
||||
// an error, the errorString will be set.
|
||||
static bool IsTrue(const std::vector<std::string> &args,
|
||||
char** errorString, cmMakefile *mf);
|
||||
std::string &errorString, cmMakefile *mf);
|
||||
|
||||
// Get a definition from the makefile. If it doesn't exist,
|
||||
// return the original string.
|
||||
|
@ -39,12 +39,12 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
|
||||
// if this is the endwhile for this while loop then execute
|
||||
if (!this->Depth)
|
||||
{
|
||||
char* errorString = 0;
|
||||
std::string errorString;
|
||||
|
||||
std::vector<std::string> expandedArguments;
|
||||
mf.ExpandArguments(this->Args, expandedArguments);
|
||||
bool isTrue =
|
||||
cmIfCommand::IsTrue(expandedArguments,&errorString,&mf);
|
||||
cmIfCommand::IsTrue(expandedArguments,errorString,&mf);
|
||||
|
||||
this->Executing = true;
|
||||
while (isTrue)
|
||||
@ -69,7 +69,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
|
||||
expandedArguments.clear();
|
||||
mf.ExpandArguments(this->Args, expandedArguments);
|
||||
isTrue =
|
||||
cmIfCommand::IsTrue(expandedArguments,&errorString,&mf);
|
||||
cmIfCommand::IsTrue(expandedArguments,errorString,&mf);
|
||||
}
|
||||
mf.RemoveFunctionBlocker(lff);
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user