summaryrefslogtreecommitdiff
path: root/src/shared/proparser/qmakebuiltins.cpp
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-07-27 21:26:10 +0200
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-08-01 16:44:55 +0200
commite739841c6314bfd5021320083823ee030d938773 (patch)
tree9083baafc72068ca293a7528e4e04611ded3adfb /src/shared/proparser/qmakebuiltins.cpp
parent75cc8575b411cb268abccd743ecf55baf1c66a42 (diff)
downloadqt-creator-e739841c6314bfd5021320083823ee030d938773.tar.gz
implement if() by means of precompilation
the performance is about the same (depending on the expression type it's better or worse), but a lot of code just disappears. Change-Id: I60eb9b87f23cc811d3f9577841c38966ecfd8e43 Reviewed-by: Daniel Teske <daniel.teske@nokia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Diffstat (limited to 'src/shared/proparser/qmakebuiltins.cpp')
-rw-r--r--src/shared/proparser/qmakebuiltins.cpp81
1 files changed, 18 insertions, 63 deletions
diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp
index 8488f5f2da..7c8f4e716e 100644
--- a/src/shared/proparser/qmakebuiltins.cpp
+++ b/src/shared/proparser/qmakebuiltins.cpp
@@ -293,8 +293,13 @@ void QMakeEvaluator::populateDeps(
}
ProStringList QMakeEvaluator::evaluateExpandFunction(
- const ProString &func, const ProStringList &args)
+ const ProString &func, const ushort *&tokPtr)
{
+ QHash<ProString, ProFunctionDef>::ConstIterator it =
+ m_functionDefs.replaceFunctions.constFind(func);
+ if (it != m_functionDefs.replaceFunctions.constEnd())
+ return evaluateFunction(*it, prepareFunctionArgs(tokPtr), 0);
+
ExpandFunc func_t = ExpandFunc(statics.expands.value(func));
if (func_t == 0) {
const QString &fn = func.toQString(m_tmp1);
@@ -306,6 +311,8 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
}
}
+ //why don't the builtin functions just use args_list? --Sam
+ const ProStringList &args = expandVariableReferences(tokPtr, 5, true);
ProStringList ret;
switch (func_t) {
@@ -924,10 +931,18 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
}
QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditionalFunction(
- const ProString &function, const ProStringList &args)
+ const ProString &function, const ushort *&tokPtr)
{
+ QHash<ProString, ProFunctionDef>::ConstIterator it =
+ m_functionDefs.testFunctions.constFind(function);
+ if (it != m_functionDefs.testFunctions.constEnd())
+ return evaluateBoolFunction(*it, prepareFunctionArgs(tokPtr), function);
+
TestFunc func_t = (TestFunc)statics.functions.value(function);
+ //why don't the builtin functions just use args_list? --Sam
+ const ProStringList &args = expandVariableReferences(tokPtr, 5, true);
+
switch (func_t) {
case T_DEFINED:
if (args.count() < 1 || args.count() > 2) {
@@ -1047,67 +1062,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditionalFunction(
evalError(fL1S("if(condition) requires one argument."));
return ReturnFalse;
}
- const ProString &cond = args.at(0);
- bool quoted = false;
- bool ret = true;
- bool orOp = false;
- bool invert = false;
- bool isFunc = false;
- int parens = 0;
- QString test;
- test.reserve(20);
- QString argsString;
- argsString.reserve(50);
- const QChar *d = cond.constData();
- const QChar *ed = d + cond.size();
- while (d < ed) {
- ushort c = (d++)->unicode();
- bool isOp = false;
- if (quoted) {
- if (c == '"')
- quoted = false;
- else if (c == '!' && test.isEmpty())
- invert = true;
- else
- test += c;
- } else if (c == '(') {
- isFunc = true;
- if (parens)
- argsString += c;
- ++parens;
- } else if (c == ')') {
- --parens;
- if (parens)
- argsString += c;
- } else if (!parens) {
- if (c == '"')
- quoted = true;
- else if (c == ':' || c == '|')
- isOp = true;
- else if (c == '!' && test.isEmpty())
- invert = true;
- else
- test += c;
- } else {
- argsString += c;
- }
- if (!quoted && !parens && (isOp || d == ed)) {
- if (m_cumulative || (orOp != ret)) {
- test = test.trimmed();
- if (isFunc)
- ret = evaluateConditionalFunction(ProString(test), ProString(argsString, NoHash));
- else
- ret = isActiveConfig(test, true);
- ret ^= invert;
- }
- orOp = (c == '|');
- invert = false;
- isFunc = false;
- test.clear();
- argsString.clear();
- }
- }
- return returnBool(ret);
+ return returnBool(evaluateConditional(args.at(0).toQString(), fL1S("(if)")));
}
case T_CONFIG: {
if (args.count() < 1 || args.count() > 2) {