JS inline: inline simple-return functions directly

This commit is contained in:
Alexey Tsvetkov
2014-08-12 21:00:56 +04:00
committed by Zalim Bashorov
parent da817e7ed2
commit cbb9e9c40e
@@ -37,7 +37,7 @@ class FunctionInlineMutator {
private final RenamingContext<JsBlock> renamingContext;
private final InsertionPoint<JsStatement> insertionPoint;
private JsBlock body;
private JsNameRef resultExpr = null;
private JsExpression resultExpr = null;
private JsLabel breakLabel = null;
public static InlineableResult getInlineableCallReplacement(
@@ -80,9 +80,15 @@ class FunctionInlineMutator {
replaceThis();
removeRedundantDefaultInitializers(arguments, parameters, body);
aliasArgumentsIfNeeded(renamingContext, arguments, parameters);
renameLocals(renamingContext, invokedFunction);
applyRenaming();
replaceReturns();
renameLocalNames(renamingContext, invokedFunction);
if (canBeExpression(body)) {
applyRenaming();
doDirectInline();
} else {
replaceReturns();
applyRenaming();
}
}
private void replaceThis() {
@@ -121,6 +127,11 @@ class FunctionInlineMutator {
}
}
private void doDirectInline() {
resultExpr = asExpression(body);
body.getStatements().clear();
}
private void doReplaceReturns(int returnCount) {
JsReturn returnOnTop = ContainerUtil.findInstance(body.getStatements(), JsReturn.class);
boolean hasReturnOnTopLevel = returnOnTop != null;
@@ -153,4 +164,17 @@ class FunctionInlineMutator {
private List<JsParameter> getParameters() {
return invokedFunction.getParameters();
}
private static boolean canBeExpression(JsBlock body) {
List<JsStatement> statements = body.getStatements();
return statements.size() == 1 && statements.get(0) instanceof JsReturn;
}
private static JsExpression asExpression(JsBlock body) {
assert canBeExpression(body);
List<JsStatement> statements = body.getStatements();
JsReturn returnStatement = (JsReturn) statements.get(0);
return returnStatement.getExpression();
}
}