Improve minification of async code

This commit is contained in:
konsoletyper 2015-03-09 11:29:49 +03:00
parent 6017bd6586
commit 97889bc217
3 changed files with 44 additions and 24 deletions

View File

@ -537,7 +537,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
args.add(variableName(i)); args.add(variableName(i));
} }
if (async) { if (async) {
args.add("$return"); args.add(getReturnVariable());
} }
for (int i = 0; i < args.size(); ++i) { for (int i = 0; i < args.size(); ++i) {
if (i > 0) { if (i > 0) {
@ -557,6 +557,18 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.append(");").ws().append("}"); writer.append(");").ws().append("}");
} }
private String getPartVariable(int index) {
if (minifying) {
return "$p" + indexToId(index);
} else {
return "$part_" + index;
}
}
private String getReturnVariable() {
return minifying ? "$r" : "$return";
}
public void renderBody(MethodNode method, boolean inner) throws IOException { public void renderBody(MethodNode method, boolean inner) throws IOException {
blockIdMap.clear(); blockIdMap.clear();
MethodReference ref = method.getReference(); MethodReference ref = method.getReference();
@ -581,7 +593,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
if (startParam < ref.parameterCount() + 1) { if (startParam < ref.parameterCount() + 1) {
writer.append(',').ws(); writer.append(',').ws();
} }
writer.append("$return"); writer.append(getReturnVariable());
} }
writer.append(")").ws().append("{").softNewLine().indent(); writer.append(")").ws().append("{").softNewLine().indent();
method.acceptVisitor(new MethodBodyRenderer()); method.acceptVisitor(new MethodBodyRenderer());
@ -601,11 +613,11 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.append(variableName(i)); writer.append(variableName(i));
writer.append(",").ws(); writer.append(",").ws();
} }
writer.append("$return)").ws().append("{").softNewLine().indent(); writer.append(getReturnVariable()).append(")").ws().append("{").softNewLine().indent();
writer.append("var $r;").softNewLine(); writer.append("var $x;").softNewLine();
writer.append("try").ws().append('{').indent().softNewLine(); writer.append("try").ws().append('{').indent().softNewLine();
writer.append("$r").ws().append("=").ws().appendMethodBody(ref).append('('); writer.append("$x").ws().append("=").ws().appendMethodBody(ref).append('(');
for (int i = startParam; i <= ref.parameterCount(); ++i) { for (int i = startParam; i <= ref.parameterCount(); ++i) {
if (i > startParam) { if (i > startParam) {
writer.append(",").ws(); writer.append(",").ws();
@ -615,9 +627,9 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.append(");").softNewLine(); writer.append(");").softNewLine();
writer.outdent().append("}").ws().append("catch").ws().append("($e)").ws() writer.outdent().append("}").ws().append("catch").ws().append("($e)").ws()
.append("{").indent().softNewLine(); .append("{").indent().softNewLine();
writer.append("return $return($rt_asyncError($e));").softNewLine(); writer.append("return ").append(getReturnVariable()).append("($rt_asyncError($e));").softNewLine();
writer.outdent().append("}"); writer.outdent().append("}");
writer.append("$return($rt_asyncResult($r));").softNewLine(); writer.append(getReturnVariable()).append("($rt_asyncResult($x));").softNewLine();
writer.outdent().append("}"); writer.outdent().append("}");
if (inner) { if (inner) {
writer.append(';'); writer.append(';');
@ -720,16 +732,17 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.append(";").softNewLine(); writer.append(";").softNewLine();
} }
for (int i = 0; i < methodNode.getBody().size(); ++i) { for (int i = 0; i < methodNode.getBody().size(); ++i) {
writer.append("var $part_").append(i).ws().append("=").ws().append("$rt_guardAsync(function("); writer.append("var ").append(getPartVariable(i)).ws().append("=").ws()
.append("$rt_guardAsync(function(");
if (i > 0) { if (i > 0) {
writer.append("$restore"); writer.append("$restore");
} }
writer.append(")").ws().append("{").indent().softNewLine(); writer.append(")").ws().append("{").indent().softNewLine();
AsyncMethodPart part = methodNode.getBody().get(i); AsyncMethodPart part = methodNode.getBody().get(i);
part.getStatement().acceptVisitor(Renderer.this); part.getStatement().acceptVisitor(Renderer.this);
writer.outdent().append("},").ws().append("$return);").softNewLine(); writer.outdent().append("},").ws().append(getReturnVariable()).append(");").softNewLine();
} }
writer.append("return $part_0();").softNewLine(); writer.append("return ").append(getPartVariable(0)).append("();").softNewLine();
} catch (IOException e) { } catch (IOException e) {
throw new RenderingException("IO error occured", e); throw new RenderingException("IO error occured", e);
} }
@ -777,7 +790,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
@Override @Override
public String getCompleteContinuation() { public String getCompleteContinuation() {
return "$return"; return getReturnVariable();
} }
@Override @Override
@ -972,18 +985,22 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
private String mapBlockId(String id) { private String mapBlockId(String id) {
String name = blockIdMap.get(id); String name = blockIdMap.get(id);
if (name == null) { if (name == null) {
StringBuilder sb = new StringBuilder();
int index = blockIdMap.size(); int index = blockIdMap.size();
do { name = "$b" + indexToId(index);
sb.append(variablePartNames.charAt(index % variablePartNames.length()));
index /= variablePartNames.length();
} while (index > 0);
name = "$b" + sb;
blockIdMap.put(id, name); blockIdMap.put(id, name);
} }
return name; return name;
} }
private String indexToId(int index) {
StringBuilder sb = new StringBuilder();
do {
sb.append(variablePartNames.charAt(index % variablePartNames.length()));
index /= variablePartNames.length();
} while (index > 0);
return sb.toString();
}
@Override @Override
public void visit(BlockStatement statement) { public void visit(BlockStatement statement) {
try { try {
@ -1046,7 +1063,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
} }
writer.append("return"); writer.append("return");
if (async) { if (async) {
writer.append(" $return($rt_asyncResult("); writer.append(' ').append(getReturnVariable()).append("($rt_asyncResult(");
} }
if (statement.getResult() != null) { if (statement.getResult() != null) {
if (!async) { if (!async) {
@ -1709,7 +1726,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
if (hasParams) { if (hasParams) {
writer.append(',').ws(); writer.append(',').ws();
} }
writer.append("$rt_continue($part_").append(expr.getAsyncTarget()).append(')'); writer.append("$rt_continue(").append(getPartVariable(expr.getAsyncTarget())).append(')');
} }
writer.append(')'); writer.append(')');
exitPriority(); exitPriority();
@ -2008,7 +2025,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.append("return ").append(naming.getFullNameForAsync(monitorEnterRef)).append("("); writer.append("return ").append(naming.getFullNameForAsync(monitorEnterRef)).append("(");
statement.getObjectRef().acceptVisitor(this); statement.getObjectRef().acceptVisitor(this);
writer.append(",").ws(); writer.append(",").ws();
writer.append("$rt_continue($part_").append(statement.getAsyncTarget()).append(')'); writer.append("$rt_continue(").append(getPartVariable(statement.getAsyncTarget())).append(')');
writer.append(");").softNewLine(); writer.append(");").softNewLine();
} else { } else {
MethodReference monitorEnterRef = new MethodReference( MethodReference monitorEnterRef = new MethodReference(

View File

@ -41,11 +41,13 @@ public class AsyncMethodGenerator implements Generator, DependencyPlugin {
writer.append("var callback").ws().append("=").ws().append("function()").ws().append("{};").softNewLine(); writer.append("var callback").ws().append("=").ws().append("function()").ws().append("{};").softNewLine();
writer.append("callback.").appendMethod(completeMethod).ws().append("=").ws().append("function(val)").ws() writer.append("callback.").appendMethod(completeMethod).ws().append("=").ws().append("function(val)").ws()
.append("{").indent().softNewLine(); .append("{").indent().softNewLine();
writer.append("return $return($rt_asyncResult(val));").softNewLine(); writer.append("return ").append(context.getCompleteContinuation()).append("($rt_asyncResult(val));")
.softNewLine();
writer.outdent().append("};").softNewLine(); writer.outdent().append("};").softNewLine();
writer.append("callback.").appendMethod(errorMethod).ws().append("=").ws().append("function(e)").ws() writer.append("callback.").appendMethod(errorMethod).ws().append("=").ws().append("function(e)").ws()
.append("{").indent().softNewLine(); .append("{").indent().softNewLine();
writer.append("return $return($rt_asyncError(e));").softNewLine(); writer.append("return ").append(context.getCompleteContinuation()).append("($rt_asyncError(e));")
.softNewLine();
writer.outdent().append("};").softNewLine(); writer.outdent().append("};").softNewLine();
writer.append("try").ws().append("{").indent().softNewLine(); writer.append("try").ws().append("{").indent().softNewLine();
writer.append("return ").appendMethodBody(asyncRef).append('('); writer.append("return ").appendMethodBody(asyncRef).append('(');
@ -58,7 +60,8 @@ public class AsyncMethodGenerator implements Generator, DependencyPlugin {
} }
writer.append("callback);").softNewLine(); writer.append("callback);").softNewLine();
writer.outdent().append("}").ws().append("catch($e)").ws().append("{").indent().softNewLine(); writer.outdent().append("}").ws().append("catch($e)").ws().append("{").indent().softNewLine();
writer.append("return $return($rt_asyncError($e));").softNewLine(); writer.append("return ").append(context.getCompleteContinuation()).append("($rt_asyncError($e));")
.softNewLine();
writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine();
} }

View File

@ -156,7 +156,7 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
writer.append("return ").append(selfName).append("(").append(context.getParameterName(1)); writer.append("return ").append(selfName).append("(").append(context.getParameterName(1));
if (context.isAsync()) { if (context.isAsync()) {
writer.append(',').ws().append("$return"); writer.append(',').ws().append(context.getCompleteContinuation());
} }
writer.append(");").softNewLine(); writer.append(");").softNewLine();
} }