mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
First working prototype of CPS
This commit is contained in:
parent
62d3e9f40e
commit
071f2bb46c
|
@ -156,11 +156,11 @@ public class Decompiler {
|
|||
}
|
||||
|
||||
public MethodNode decompile(MethodHolder method) {
|
||||
return method.getModifiers().contains(ElementModifier.NATIVE) ? decompileNative(method, false) :
|
||||
return method.getModifiers().contains(ElementModifier.NATIVE) ? decompileNative(method) :
|
||||
!asyncMethods.contains(method.getReference()) ? decompileRegular(method) : decompileAsync(method);
|
||||
}
|
||||
|
||||
public NativeMethodNode decompileNative(MethodHolder method, boolean async) {
|
||||
public NativeMethodNode decompileNative(MethodHolder method) {
|
||||
Generator generator = generators.get(method.getReference());
|
||||
if (generator == null) {
|
||||
AnnotationHolder annotHolder = method.getAnnotations().get(GeneratedBy.class.getName());
|
||||
|
@ -182,7 +182,7 @@ public class Decompiler {
|
|||
method.getDescriptor()));
|
||||
methodNode.getModifiers().addAll(mapModifiers(method.getModifiers()));
|
||||
methodNode.setGenerator(generator);
|
||||
methodNode.setAsync(async);
|
||||
methodNode.setAsync(asyncMethods.contains(method.getReference()));
|
||||
return methodNode;
|
||||
}
|
||||
|
||||
|
|
|
@ -526,7 +526,10 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
writer.append(variableName(i));
|
||||
}
|
||||
if (method.isAsync()) {
|
||||
writer.append(',').ws().append("$return,").ws().append("$throw");
|
||||
if (startParam < ref.parameterCount() + 1) {
|
||||
writer.append(',').ws();
|
||||
}
|
||||
writer.append("$return,").ws().append("$throw");
|
||||
}
|
||||
writer.append(")").ws().append("{").softNewLine().indent();
|
||||
method.acceptVisitor(new MethodBodyRenderer());
|
||||
|
@ -1438,6 +1441,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
lastCallSite = callSite;
|
||||
}
|
||||
boolean virtual = false;
|
||||
boolean hasParams = false;
|
||||
switch (expr.getType()) {
|
||||
case STATIC:
|
||||
writer.append(fullName).append("(");
|
||||
|
@ -1447,12 +1451,14 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
writer.append(",").ws();
|
||||
}
|
||||
expr.getArguments().get(i).acceptVisitor(this);
|
||||
hasParams = true;
|
||||
}
|
||||
break;
|
||||
case SPECIAL:
|
||||
writer.append(fullName).append("(");
|
||||
prevCallSite = debugEmitter.emitCallSite();
|
||||
expr.getArguments().get(0).acceptVisitor(this);
|
||||
hasParams = true;
|
||||
for (int i = 1; i < expr.getArguments().size(); ++i) {
|
||||
writer.append(",").ws();
|
||||
expr.getArguments().get(i).acceptVisitor(this);
|
||||
|
@ -1465,6 +1471,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
if (i > 1) {
|
||||
writer.append(",").ws();
|
||||
}
|
||||
hasParams = true;
|
||||
expr.getArguments().get(i).acceptVisitor(this);
|
||||
}
|
||||
virtual = true;
|
||||
|
@ -1476,12 +1483,16 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
if (i > 0) {
|
||||
writer.append(",").ws();
|
||||
}
|
||||
hasParams = true;
|
||||
expr.getArguments().get(i).acceptVisitor(this);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (expr.getAsyncTarget() != null) {
|
||||
writer.append(',').ws().append("$rt_continue($part_").append(expr.getAsyncTarget()).append(')');
|
||||
if (hasParams) {
|
||||
writer.append(',').ws();
|
||||
}
|
||||
writer.append("$rt_continue($part_").append(expr.getAsyncTarget()).append(')');
|
||||
}
|
||||
writer.append(')');
|
||||
if (lastCallSite != null) {
|
||||
|
|
|
@ -436,7 +436,8 @@ public class TeaVM implements TeaVMHost, ServiceRepository {
|
|||
renderer.renderStringPool();
|
||||
for (Map.Entry<String, TeaVMEntryPoint> entry : entryPoints.entrySet()) {
|
||||
sourceWriter.append("var ").append(entry.getKey()).ws().append("=").ws()
|
||||
.appendMethodBody(entry.getValue().reference).append(";").softNewLine();
|
||||
.append("$rt_rootInvocationAdapter(")
|
||||
.appendMethodBody(entry.getValue().reference).append(");").softNewLine();
|
||||
}
|
||||
for (Map.Entry<String, String> entry : exportedClasses.entrySet()) {
|
||||
sourceWriter.append("var ").append(entry.getKey()).ws().append("=").ws()
|
||||
|
|
|
@ -406,6 +406,14 @@ function $rt_asyncAdapter(f) {
|
|||
return $return(result);
|
||||
}
|
||||
}
|
||||
function $rt_rootInvocationAdapter(f) {
|
||||
return function() {
|
||||
var args = Array.prototype.slice.apply(arguments);
|
||||
args.push(function() {});
|
||||
args.push(function() {});
|
||||
return f.apply(this, args);
|
||||
}
|
||||
}
|
||||
var $rt_stringPool_instance;
|
||||
function $rt_stringPool(strings) {
|
||||
$rt_stringPool_instance = new Array(strings.length);
|
||||
|
@ -420,11 +428,13 @@ var $rt_continueCounter = 0;
|
|||
function $rt_continue(f) {
|
||||
if ($rt_continueCounter++ == 10) {
|
||||
$rt_continueCounter = 0;
|
||||
var self = f;
|
||||
var args = arguments;
|
||||
setTimeout(function() {
|
||||
f.apply(self, args);
|
||||
}, 0);
|
||||
return function() {
|
||||
var self = this;
|
||||
var args = arguments;
|
||||
setTimeout(function() {
|
||||
f.apply(self, args);
|
||||
}, 0);
|
||||
};
|
||||
} else {
|
||||
return f;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user