/** Resolve all continues of this statement. */
boolean resolveContinues(JCTree tree) {
boolean result = false;
List<PendingExit> exits = pendingExits.toList();
pendingExits = new ListBuffer<PendingExit>();
for (; exits.nonEmpty(); exits = exits.tail) {
PendingExit exit = exits.head;
if (exit.tree.getTag() == JCTree.CONTINUE &&
((JCContinue) exit.tree).target == tree) {
inits.andSet(exit.inits); // 相当于取交集
uninits.andSet(exit.uninits);
result = true;
} else {
pendingExits.append(exit);
}
}
return result;
}
调用的地方如下截图:

/** Resolve all breaks of this statement. */
boolean resolveBreaks(JCTree tree, // tree是break的跳出目标
ListBuffer<PendingExit> oldPendingExits) {
boolean result = false;
List<PendingExit> exits = pendingExits.toList();
pendingExits = oldPendingExits;
for (; exits.nonEmpty(); exits = exits.tail) {
PendingExit exit = exits.head;
if (exit.tree.getTag() == JCTree.BREAK &&
((JCBreak) exit.tree).target == tree) {
inits.andSet(exit.inits);
uninits.andSet(exit.uninits);
result = true;
} else {
pendingExits.append(exit);
}
}
return result;
}
调用的地方如下:

本文深入探讨了Java编译器内部如何处理continue和break语句,通过具体的代码片段展示了如何解析并处理这些控制流语句,为理解Java编译原理提供了宝贵的见解。
10万+

被折叠的 条评论
为什么被折叠?



