From bb063b35f4a4442a58f981e3a1e9fe8c7b054393 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 27 Jul 2012 19:56:28 +0200 Subject: [PATCH] don't ignore parsing errors in eval() and on the command line to optimally support cumulative mode, the parser will happily return a bytecode object even when parsing failed, so errors must be treated later. Change-Id: I1a5c0ca9bf46a93d7359f590f0dd0ddc96baba0a Reviewed-by: Daniel Teske Reviewed-by: Oswald Buddenhagen --- src/shared/proparser/qmakebuiltins.cpp | 18 +++++++++++------- src/shared/proparser/qmakeevaluator.cpp | 8 +++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp index 20284c1c276..8488f5f2dac 100644 --- a/src/shared/proparser/qmakebuiltins.cpp +++ b/src/shared/proparser/qmakebuiltins.cpp @@ -1012,15 +1012,19 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditionalFunction( case T_REQUIRES: #endif case T_EVAL: { + VisitReturn ret = ReturnFalse; ProFile *pro = m_parser->parsedProBlock(fL1S("(eval)"), args.join(statics.field_sep)); - if (!pro) - return ReturnFalse; - m_locationStack.push(m_current); - visitProBlock(pro, pro->tokPtr()); - m_current = m_locationStack.pop(); - pro->deref(); - return ReturnTrue; // This return value is not too useful, but that's qmake + if (pro) { + if (m_cumulative || pro->isOk()) { + m_locationStack.push(m_current); + visitProBlock(pro, pro->tokPtr()); + ret = ReturnTrue; // This return value is not too useful, but that's qmake + m_current = m_locationStack.pop(); + } + pro->deref(); + } + return ret; } case T_BREAK: if (m_skipLevel) diff --git a/src/shared/proparser/qmakeevaluator.cpp b/src/shared/proparser/qmakeevaluator.cpp index 60badb0e878..d9d9cc11158 100644 --- a/src/shared/proparser/qmakeevaluator.cpp +++ b/src/shared/proparser/qmakeevaluator.cpp @@ -1128,9 +1128,11 @@ void QMakeEvaluator::visitCmdLine(const QString &cmds) { if (!cmds.isEmpty()) { if (ProFile *pro = m_parser->parsedProBlock(fL1S("(command line)"), cmds)) { - m_locationStack.push(m_current); - visitProBlock(pro, pro->tokPtr()); - m_current = m_locationStack.pop(); + if (pro->isOk()) { + m_locationStack.push(m_current); + visitProBlock(pro, pro->tokPtr()); + m_current = m_locationStack.pop(); + } pro->deref(); } }