void tryMinimizeSwitchExits(Node n, Token exitType, @Nullable String labelName) { checkState(n.isSwitch()); // Skipping the switch condition, visit all the children. for (Node c = n.getSecondChild(); c != null; c = c.getNext()) { if (c != n.getLastChild()) { tryMinimizeSwitchCaseExits(c, exitType, labelName); } else { // Last case, the last case block can be optimized more aggressively. tryMinimizeExits(c.getLastChild(), exitType, labelName); } } }
void tryMinimizeSwitchExits(Node n, int exitType, @Nullable String labelName) { Preconditions.checkState(n.isSwitch()); // Skipping the switch condition, visit all the children. for (Node c = n.getSecondChild(); c != null; c = c.getNext()) { if (c != n.getLastChild()) { tryMinimizeSwitchCaseExits(c, exitType, labelName); } else { // Last case, the last case block can be optimized more aggressively. tryMinimizeExits(c.getLastChild(), exitType, labelName); } } }
switch (n.getType()) { case Token.LABEL: tryMinimizeExits( n.getLastChild(), Token.BREAK, n.getFirstChild().getString()); break; tryMinimizeExits(NodeUtil.getLoopCodeBlock(n), Token.CONTINUE, null); break; tryMinimizeExits(NodeUtil.getLoopCodeBlock(n), Token.CONTINUE, null); tryMinimizeExits(n.getFirstChild(), Token.BREAK, null); tryMinimizeExits(n.getLastChild(), Token.RETURN, null); break;
switch (n.getToken()) { case LABEL: tryMinimizeExits( n.getLastChild(), Token.BREAK, n.getFirstChild().getString()); break; case FOR_AWAIT_OF: case WHILE: tryMinimizeExits(NodeUtil.getLoopCodeBlock(n), Token.CONTINUE, null); break; tryMinimizeExits(NodeUtil.getLoopCodeBlock(n), Token.CONTINUE, null); tryMinimizeExits(n.getFirstChild(), Token.BREAK, null); tryMinimizeExits(n, Token.RETURN, null);
/** * Attempt to remove explicit exits from switch cases that also occur implicitly * after the switch. */ void tryMinimizeSwitchCaseExits(Node n, Token exitType, @Nullable String labelName) { checkState(NodeUtil.isSwitchCase(n)); checkState(n != n.getParent().getLastChild()); Node block = n.getLastChild(); Node maybeBreak = block.getLastChild(); if (maybeBreak == null || !maybeBreak.isBreak() || maybeBreak.hasChildren()) { // Can not minimize exits from a case without an explicit break from the switch. return; } // Now try to minimize the exits of the last child before the break, if it is removed // look at what has become the child before the break. Node childBeforeBreak = maybeBreak.getPrevious(); while (childBeforeBreak != null) { Node c = childBeforeBreak; tryMinimizeExits(c, exitType, labelName); // If the node is still the last child, we are done. childBeforeBreak = maybeBreak.getPrevious(); if (c == childBeforeBreak) { break; } } }
/** * Attempt to remove explicit exits from switch cases that also occur implicitly * after the switch. */ void tryMinimizeSwitchCaseExits(Node n, int exitType, @Nullable String labelName) { Preconditions.checkState(NodeUtil.isSwitchCase(n)); Preconditions.checkState(n != n.getParent().getLastChild()); Node block = n.getLastChild(); Node maybeBreak = block.getLastChild(); if (maybeBreak == null || !maybeBreak.isBreak() || maybeBreak.hasChildren()) { // Can not minimize exits from a case without an explicit break from the switch. return; } // Now try to minimize the exits of the last child before the break, if it is removed // look at what has become the child before the break. Node childBeforeBreak = block.getChildBefore(maybeBreak); while (childBeforeBreak != null) { Node c = childBeforeBreak; tryMinimizeExits(c, exitType, labelName); // If the node is still the last child, we are done. childBeforeBreak = block.getChildBefore(maybeBreak); if (c == childBeforeBreak) { break; } } }
tryMinimizeExits(ifBlock, exitType, labelName); Node elseBlock = ifBlock.getNext(); if (elseBlock != null) { tryMinimizeExits(elseBlock, exitType, labelName); tryMinimizeExits(tryBlock, exitType, labelName); Node allCatchNodes = NodeUtil.getCatchBlock(n); if (NodeUtil.hasCatchHandler(allCatchNodes)) { Node catchNode = allCatchNodes.getFirstChild(); Node catchCodeBlock = catchNode.getLastChild(); tryMinimizeExits(catchCodeBlock, exitType, labelName); tryMinimizeExits(labelBlock, exitType, labelName); tryMinimizeExits(c, exitType, labelName);
tryMinimizeExits(ifBlock, exitType, labelName); Node elseBlock = ifBlock.getNext(); if (elseBlock != null) { tryMinimizeExits(elseBlock, exitType, labelName); tryMinimizeExits(tryBlock, exitType, labelName); Node allCatchNodes = NodeUtil.getCatchBlock(n); if (NodeUtil.hasCatchHandler(allCatchNodes)) { Node catchNode = allCatchNodes.getFirstChild(); Node catchCodeBlock = catchNode.getLastChild(); tryMinimizeExits(catchCodeBlock, exitType, labelName); tryMinimizeExits(labelBlock, exitType, labelName); tryMinimizeExits(c, exitType, labelName);