From 51f5ee959f58ee198e0fc51e2ad0161c612bf8d1 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Wed, 13 May 2009 12:32:24 +0200 Subject: [PATCH] put condition state variables into a structure to enable cleaner save/restore - for later --- src/shared/proparser/profileevaluator.cpp | 50 ++++++++++++----------- src/shared/proparser/profileevaluator.h | 2 + 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index 5ae4dc994c5..453fe88bd01 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -193,11 +193,13 @@ public: QStringList qmakeFeaturePaths(); - enum { ConditionTrue, ConditionFalse, ConditionElse }; - int m_condition; - int m_prevCondition; - bool m_updateCondition; - bool m_invertNext; + enum Condition { ConditionFalse, ConditionTrue, ConditionElse }; + struct State { + Condition condition; + Condition prevCondition; + bool updateCondition; // == !(enclosingBlock()->kind() & ScopeContents) + } m_sts; + bool m_invertNext; // Short-lived, so not in State int m_skipLevel; bool m_cumulative; bool m_isFirstVariableValue; @@ -224,6 +226,8 @@ public: bool m_parsePreAndPostFiles; }; +Q_DECLARE_TYPEINFO(ProFileEvaluator::Private::State, Q_PRIMITIVE_TYPE); + ProFileEvaluator::Private::Private(ProFileEvaluator *q_) : q(q_) { @@ -236,8 +240,8 @@ ProFileEvaluator::Private::Private(ProFileEvaluator *q_) m_cumulative = true; // Evaluator state - m_updateCondition = false; - m_condition = ConditionFalse; + m_sts.updateCondition = false; + m_sts.condition = ConditionFalse; m_invertNext = false; m_skipLevel = 0; m_isFirstVariableValue = true; @@ -556,16 +560,16 @@ void ProFileEvaluator::Private::updateItem() bool ProFileEvaluator::Private::visitBeginProBlock(ProBlock *block) { if (block->blockKind() == ProBlock::ScopeKind) { - m_updateCondition = true; + m_sts.updateCondition = true; if (!m_skipLevel) { - m_prevCondition = m_condition; - m_condition = ConditionFalse; + m_sts.prevCondition = m_sts.condition; + m_sts.condition = ConditionFalse; } else { - Q_ASSERT(m_condition != ConditionTrue); + Q_ASSERT(m_sts.condition != ConditionTrue); } } else if (block->blockKind() & ProBlock::ScopeContentsKind) { - m_updateCondition = false; - if (m_condition != ConditionTrue) + m_sts.updateCondition = false; + if (m_sts.condition != ConditionTrue) ++m_skipLevel; else Q_ASSERT(!m_skipLevel); @@ -577,12 +581,12 @@ bool ProFileEvaluator::Private::visitEndProBlock(ProBlock *block) { if (block->blockKind() & ProBlock::ScopeContentsKind) { if (m_skipLevel) { - Q_ASSERT(m_condition != ConditionTrue); + Q_ASSERT(m_sts.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; + m_sts.condition = ConditionTrue; } } return true; @@ -619,13 +623,13 @@ bool ProFileEvaluator::Private::visitProCondition(ProCondition *cond) 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 (m_sts.prevCondition == ConditionTrue) + m_sts.condition = ConditionElse; + else if (m_sts.prevCondition == ConditionFalse) + m_sts.condition = ConditionTrue; + } else if (m_sts.condition == ConditionFalse) { if (isActiveConfig(cond->text(), true) ^ m_invertNext) - m_condition = ConditionTrue; + m_sts.condition = ConditionTrue; } } m_invertNext = false; @@ -865,7 +869,7 @@ bool ProFileEvaluator::Private::visitProValue(ProValue *value) bool ProFileEvaluator::Private::visitProFunction(ProFunction *func) { - if (!m_updateCondition || m_condition == ConditionFalse) { + if (!m_sts.updateCondition || m_sts.condition == ConditionFalse) { QString text = func->text(); int lparen = text.indexOf(QLatin1Char('(')); int rparen = text.lastIndexOf(QLatin1Char(')')); @@ -875,7 +879,7 @@ bool ProFileEvaluator::Private::visitProFunction(ProFunction *func) m_lineNo = func->lineNumber(); bool result = evaluateConditionalFunction(funcName.trimmed(), arguments); if (!m_skipLevel && (result ^ m_invertNext)) - m_condition = ConditionTrue; + m_sts.condition = ConditionTrue; } m_invertNext = false; return true; diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h index d7eb5a549a8..de4b07f41d0 100644 --- a/src/shared/proparser/profileevaluator.h +++ b/src/shared/proparser/profileevaluator.h @@ -87,6 +87,8 @@ public: private: class Private; Private *d; + + template<typename T> friend class QTypeInfo; }; QT_END_NAMESPACE -- GitLab