| Code with Finding: |
class OptimizeReturns {
/**
* For the supplied function node, rewrite all the return expressions so that:
* return foo();
* becomes:
* foo(); return;
* Useless return will be removed later by the peephole optimization passes.
*/
private void rewriteReturns(
final SimpleDefinitionFinder defFinder, Node fnNode) {
Preconditions.checkState(NodeUtil.isFunction(fnNode));
NodeUtil.visitPostOrder(
fnNode.getLastChild(),
new NodeUtil.Visitor() {
@Override
public void visit(Node node) {
if (node.getType() == Token.RETURN && node.hasOneChild()) {
boolean keepValue = NodeUtil.mayHaveSideEffects(
node.getFirstChild(), compiler);
if (!keepValue) {
defFinder.removeReferences(node.getFirstChild());
}
Node result = node.removeFirstChild();
if (keepValue) {
node.getParent().addChildBefore(
new Node(
Token.EXPR_RESULT, result).copyInformationFrom(result), node);
}
compiler.reportCodeChange();
}
}
},
new NodeUtil.MatchShallowStatement());
}
}
|