short-cut evaluation inside if() tests

this is consistent with the top-level scope evaluation.
This commit is contained in:
Oswald Buddenhagen
2010-04-08 15:36:17 +02:00
parent 40ffa44b74
commit 295e07eadc

View File

@@ -2503,6 +2503,8 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
logMessage(format("unexpected next().")); logMessage(format("unexpected next()."));
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
case T_IF: { case T_IF: {
if (m_skipLevel && !m_cumulative)
return ProItem::ReturnFalse;
if (args.count() != 1) { if (args.count() != 1) {
logMessage(format("if(condition) requires one argument.")); logMessage(format("if(condition) requires one argument."));
return ProItem::ReturnFalse; return ProItem::ReturnFalse;
@@ -2560,19 +2562,13 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction(
args += c; args += c;
} }
if (!parens && (isOp || d == ed)) { if (!parens && (isOp || d == ed)) {
// Yes, qmake doesn't shortcut evaluations here. We can't, either, if (m_cumulative || (orOp != ret)) {
// as some test functions have side effects. if (isFunc)
bool success; ret = evaluateConditionalFunction(test, args);
if (isFunc) {
success = evaluateConditionalFunction(test, args);
} else {
success = isActiveConfig(test, true);
}
success ^= invert;
if (orOp)
ret |= success;
else else
ret &= success; ret = isActiveConfig(test, true);
ret ^= invert;
}
orOp = (c == '|'); orOp = (c == '|');
invert = false; invert = false;
isFunc = false; isFunc = false;