summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2008-12-16 10:48:49 +0100
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2008-12-18 16:21:45 +0100
commit72d965e2d38243bb700745684a23a82f5dfbf761 (patch)
tree435c8e117fb58312222fb0aa3d7a4a8c8a260ad0 /shared
parent2274ceb47dd80c0eb893ee1d6747f88a23e9adcb (diff)
downloadqt-creator-72d965e2d38243bb700745684a23a82f5dfbf761.tar.gz
Fixes: processing of else branches
Diffstat (limited to 'shared')
-rw-r--r--shared/proparser/profileevaluator.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/shared/proparser/profileevaluator.cpp b/shared/proparser/profileevaluator.cpp
index 723c6e2216..2efbbe90b5 100644
--- a/shared/proparser/profileevaluator.cpp
+++ b/shared/proparser/profileevaluator.cpp
@@ -530,11 +530,15 @@ bool ProFileEvaluator::Private::visitBeginProBlock(ProBlock *block)
if (!m_skipLevel) {
m_prevCondition = m_condition;
m_condition = ConditionFalse;
+ } else {
+ Q_ASSERT(m_condition != ConditionTrue);
}
} else if (block->blockKind() & ProBlock::ScopeContentsKind) {
m_updateCondition = false;
if (m_condition != ConditionTrue)
++m_skipLevel;
+ else
+ Q_ASSERT(!m_skipLevel);
}
return true;
}
@@ -542,8 +546,14 @@ bool ProFileEvaluator::Private::visitBeginProBlock(ProBlock *block)
bool ProFileEvaluator::Private::visitEndProBlock(ProBlock *block)
{
if (block->blockKind() & ProBlock::ScopeContentsKind) {
- if (m_skipLevel)
+ if (m_skipLevel) {
+ Q_ASSERT(m_condition != ConditionTrue);
--m_skipLevel;
+ } else {
+ // Conditionals contained inside this block may have changed the state.
+ // So we reset it here to make an else following us do the right thing.
+ m_condition = ConditionTrue;
+ }
}
return true;
}
@@ -572,8 +582,12 @@ bool ProFileEvaluator::Private::visitProCondition(ProCondition *cond)
{
if (!m_skipLevel) {
if (cond->text().toLower() == QLatin1String("else")) {
+ // The state ConditionElse makes sure that subsequential elses are ignored.
+ // That's braindead, but qmake is like that.
if (m_prevCondition == ConditionTrue)
m_condition = ConditionElse;
+ else if (m_prevCondition == ConditionFalse)
+ m_condition = ConditionTrue;
} else if (m_condition == ConditionFalse) {
if (isActiveConfig(cond->text(), true) ^ m_invertNext)
m_condition = ConditionTrue;