bypassNesting():后面紧接代码块。表示消除前文的环境,独立运行后面的代码块。bypassNesting()会暂时清空堆栈,前文定义的任何变量都无法在bypassNesting后接的代码块中被识别。
下面是系统库中的一个案例:
defineTest(qtConfOutput_reloadSpec) {
!isEmpty($${currentConfig}.output.devicePro)| \
!isEmpty(config.input.sysroot): \
reloadSpec()
# toolchain.prf uses this.
dummy = $$qtConfEvaluate("features.cross_compile")
bypassNesting() { #bypassNesting会暂时清空堆栈。在此处,上面的的dummy变量就无法在下面的代码块中被识别。
QMAKE_INTERNAL_INCLUDED_FEATURES -= \
$$[QT_HOST_DATA/src]/mkspecs/features/mac/toolchain.prf \
$$[QT_HOST_DATA/src]/mkspecs/features/toolchain.prf
load(toolchain)
}
}
下面是处理bypassNesting的源码:
E:\workspace\QtWork\qmake\library\qmakeevaluator.cpp
QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock(
const ushort *tokPtr)
{
.......
case TokBypassNesting:
blockLen = getBlockLen(tokPtr);
if ((m_cumulative || okey != or_op) && blockLen) {
ProValueMapStack savedValuemapStack = m_valuemapStack; #语法解释器中存放变量及对应值的全局的map stack。
m_valuemapStack.clear();
m_valuemapStack.append(savedValuemapStack.takeFirst()); #将原先stack中的第一个变量-值对放入m_valuemapStack.
traceMsg("visiting nesting-bypassing block");
ret = visitProBlock(tokPtr);
traceMsg("visited nesting-bypassing block");
savedValuemapStack.prepend(m_valuemapStack.first());
m_valuemapStack = savedValuemapStack; #将原先stack中所有的变量-值对全部放回m_valuemapStack.
} else {
traceMsg("skipped nesting-bypassing block");
ret = ReturnTrue;
}
tokPtr += blockLen;
okey = true, or_op = false; // force next evaluation
break;
......
}