summaryrefslogtreecommitdiffstats
path: root/Source/cmGeneratorExpression.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmGeneratorExpression.cxx')
-rw-r--r--Source/cmGeneratorExpression.cxx65
1 files changed, 39 insertions, 26 deletions
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx
index 198b43a..0885616 100644
--- a/Source/cmGeneratorExpression.cxx
+++ b/Source/cmGeneratorExpression.cxx
@@ -22,48 +22,50 @@
//----------------------------------------------------------------------------
cmGeneratorExpression::cmGeneratorExpression(
- cmMakefile* mf, const char* config,
- cmListFileBacktrace const& backtrace, bool quiet):
- Makefile(mf), Config(config), Backtrace(backtrace), Quiet(quiet),
- NeedsParsing(true)
+ cmListFileBacktrace const& backtrace):
+ Backtrace(backtrace), CompiledExpression(0)
{
}
//----------------------------------------------------------------------------
-const char* cmGeneratorExpression::Process(std::string const& input)
+const cmCompiledGeneratorExpression &
+cmGeneratorExpression::Parse(std::string const& input)
{
- return this->Process(input.c_str());
+ return this->Parse(input.c_str());
}
//----------------------------------------------------------------------------
-const char* cmGeneratorExpression::Process(const char* input)
+const cmCompiledGeneratorExpression &
+cmGeneratorExpression::Parse(const char* input)
{
- this->Parse(input);
- return this->Evaluate(this->Makefile, this->Config, this->Quiet);
-}
-
-//----------------------------------------------------------------------------
-void cmGeneratorExpression::Parse(const char* input)
-{
- this->Evaluators.clear();
-
- this->Input = input;
cmGeneratorExpressionLexer l;
- std::vector<cmGeneratorExpressionToken> tokens = l.Tokenize(this->Input);
- this->NeedsParsing = l.GetSawGeneratorExpression();
+ std::vector<cmGeneratorExpressionToken> tokens = l.Tokenize(input);
+ bool needsParsing = l.GetSawGeneratorExpression();
+ std::vector<cmGeneratorExpressionEvaluator*> evaluators;
- if (!this->NeedsParsing)
+ if (needsParsing)
{
- return;
+ cmGeneratorExpressionParser p(tokens);
+ p.Parse(evaluators);
}
- cmGeneratorExpressionParser p(tokens);
- p.Parse(this->Evaluators);
+ delete this->CompiledExpression;
+ this->CompiledExpression = new cmCompiledGeneratorExpression(
+ this->Backtrace,
+ evaluators,
+ input,
+ needsParsing);
+ return *this->CompiledExpression;
+}
+
+cmGeneratorExpression::~cmGeneratorExpression()
+{
+ delete this->CompiledExpression;
}
//----------------------------------------------------------------------------
-const char *cmGeneratorExpression::Evaluate(
- cmMakefile* mf, const char* config, bool quiet)
+const char *cmCompiledGeneratorExpression::Evaluate(
+ cmMakefile* mf, const char* config, bool quiet) const
{
if (!this->NeedsParsing)
{
@@ -99,8 +101,19 @@ const char *cmGeneratorExpression::Evaluate(
return this->Output.c_str();
}
+cmCompiledGeneratorExpression::cmCompiledGeneratorExpression(
+ cmListFileBacktrace const& backtrace,
+ const std::vector<cmGeneratorExpressionEvaluator*> &evaluators,
+ const char *input, bool needsParsing)
+ : Backtrace(backtrace), Evaluators(evaluators), Input(input),
+ NeedsParsing(needsParsing)
+{
+
+}
+
+
//----------------------------------------------------------------------------
-cmGeneratorExpression::~cmGeneratorExpression()
+cmCompiledGeneratorExpression::~cmCompiledGeneratorExpression()
{
std::vector<cmGeneratorExpressionEvaluator*>::const_iterator it
= this->Evaluators.begin();