Merged with latest async branch. Also added MonitorExitInstruction and MonitorEnterInstruction classes, and updated all associated visitors. These don't do anything yet though.

This commit is contained in:
Steve Hannah 2015-02-06 14:11:07 -08:00
parent d84889798c
commit cca4336a15
24 changed files with 301 additions and 15 deletions

View File

@ -127,13 +127,12 @@ public class ObjectNativeGenerator implements Generator, Injector, DependencyPlu
writer.append("(function(){").indent().softNewLine(); writer.append("(function(){").indent().softNewLine();
writer.append("var completed = false;").softNewLine(); writer.append("var completed = false;").softNewLine();
writer.append("var retCallback = ").append(context.getCompleteContinuation()).append(";").softNewLine(); writer.append("var retCallback = ").append(context.getCompleteContinuation()).append(";").softNewLine();
writer.append("console.log(retCallback);").softNewLine();
writer.append("var callback = function(){").indent().softNewLine(); writer.append("var callback = function(){").indent().softNewLine();
writer.append("if (completed){return;} completed=true;").softNewLine(); writer.append("if (completed){return;} completed=true;").softNewLine();
writer.append("retCallback();").softNewLine(); writer.append("retCallback($rt_asyncResult(null));").softNewLine();
writer.outdent().append("};").softNewLine(); writer.outdent().append("};").softNewLine();
writer.append("if (").append(pname).append(">0){").indent().softNewLine(); writer.append("if (").append(pname).append(">0){").indent().softNewLine();
writer.append("setTimeout(callback, ").append(pname).append(");").softNewLine(); writer.append("$rt_setTimeout(callback, ").append(pname).append(");").softNewLine();
writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine();
addNotifyListener(context, writer, "callback"); addNotifyListener(context, writer, "callback");
writer.outdent().append("})();").softNewLine(); writer.outdent().append("})();").softNewLine();
@ -162,18 +161,16 @@ public class ObjectNativeGenerator implements Generator, Injector, DependencyPlu
private void sendNotify(GeneratorContext context, SourceWriter writer) throws IOException { private void sendNotify(GeneratorContext context, SourceWriter writer) throws IOException {
String lArr = getNotifyListeners(context); String lArr = getNotifyListeners(context);
writer.append("setTimeout(function(){").indent().softNewLine(); writer.append("$rt_setTimeout(function(){").indent().softNewLine();
writer.append("if (!").append(lArr).append(" || ").append(lArr).append(".length===0){return;}").softNewLine(); writer.append("if (!").append(lArr).append(" || ").append(lArr).append(".length===0){return;}").softNewLine();
writer.append("var m = ").append(lArr).append(".shift();").softNewLine(); writer.append(lArr).append(".shift().apply(null);").softNewLine();
writer.append("console.log('Notify callback : '+m);").softNewLine();
writer.append("m.apply(null);").softNewLine();
writer.outdent().append("}, 0);").softNewLine(); writer.outdent().append("}, 0);").softNewLine();
} }
private void sendNotifyAll(GeneratorContext context, SourceWriter writer) throws IOException { private void sendNotifyAll(GeneratorContext context, SourceWriter writer) throws IOException {
String obj = context.getParameterName(0); String obj = context.getParameterName(0);
String lArr = getNotifyListeners(context); String lArr = getNotifyListeners(context);
writer.append("setTimeout(function(){").indent().softNewLine(); writer.append("$rt_setTimeout(function(){").indent().softNewLine();
writer.append("if (!").append(lArr).append("){return;}").softNewLine(); writer.append("if (!").append(lArr).append("){return;}").softNewLine();
writer.append("while (").append(lArr).append(".length>0){").indent().softNewLine(); writer.append("while (").append(lArr).append(".length>0){").indent().softNewLine();
writer.append(lArr).append(".shift().call(null);").softNewLine(); writer.append(lArr).append(".shift().call(null);").softNewLine();

View File

@ -58,20 +58,20 @@ public class ThreadNativeGenerator implements Generator, DependencyPlugin {
} }
private void generateSleep(GeneratorContext context, SourceWriter writer) throws IOException { private void generateSleep(GeneratorContext context, SourceWriter writer) throws IOException {
writer.append("setTimeout(function() {").indent().softNewLine(); writer.append("$rt_setTimeout(function() {").indent().softNewLine();
writer.append(context.getCompleteContinuation()).append("($rt_asyncResult(null));").softNewLine(); writer.append(context.getCompleteContinuation()).append("($rt_asyncResult(null));").softNewLine();
writer.outdent().append("},").ws().append(context.getParameterName(1)).append(");").softNewLine(); writer.outdent().append("},").ws().append(context.getParameterName(1)).append(");").softNewLine();
} }
private void generateYield(GeneratorContext context, SourceWriter writer) throws IOException { private void generateYield(GeneratorContext context, SourceWriter writer) throws IOException {
writer.append("setTimeout(function() {").indent().softNewLine(); writer.append("$rt_setTimeout(function() {").indent().softNewLine();
writer.append(context.getCompleteContinuation()).append("($rt_asyncResult(null));").softNewLine(); writer.append(context.getCompleteContinuation()).append("($rt_asyncResult(null));").softNewLine();
writer.outdent().append("},").ws().append("0);").softNewLine(); writer.outdent().append("},").ws().append("0);").softNewLine();
} }
private void generateStart(GeneratorContext context, SourceWriter writer) throws IOException { private void generateStart(GeneratorContext context, SourceWriter writer) throws IOException {
String obj = context.getParameterName(0); String obj = context.getParameterName(0);
writer.append("setTimeout(function() { $rt_rootInvocationAdapter(").appendMethodBody(launchRef).append(")(") writer.append("$rt_setTimeout(function() { $rt_rootInvocationAdapter(").appendMethodBody(launchRef).append(")(")
.append(obj).append(");},0);").softNewLine(); .append(obj).append(");},0);").softNewLine();
} }
} }

View File

@ -153,5 +153,15 @@ public class DiskProgramCache implements ProgramCache {
@Override public void visit(IsInstanceInstruction insn) { } @Override public void visit(IsInstanceInstruction insn) { }
@Override public void visit(InitClassInstruction insn) { } @Override public void visit(InitClassInstruction insn) { }
@Override public void visit(NullCheckInstruction insn) { } @Override public void visit(NullCheckInstruction insn) { }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }
} }

View File

@ -594,6 +594,16 @@ public class ProgramIO {
throw new IOExceptionWrapper(e); throw new IOExceptionWrapper(e);
} }
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }
private static class IOExceptionWrapper extends RuntimeException { private static class IOExceptionWrapper extends RuntimeException {

View File

@ -666,4 +666,14 @@ class StatementGenerator implements InstructionVisitor {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
assign(Expr.unary(UnaryOperation.NULL_CHECK, Expr.var(insn.getValue().getIndex())), insn.getReceiver()); assign(Expr.unary(UnaryOperation.NULL_CHECK, Expr.var(insn.getValue().getIndex())), insn.getReceiver());
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }

View File

@ -201,4 +201,14 @@ class InstructionReadVisitor implements InstructionVisitor {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
reader.nullCheck(insn.getReceiver(), insn.getValue()); reader.nullCheck(insn.getReceiver(), insn.getValue());
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }

View File

@ -87,4 +87,8 @@ public interface InstructionVisitor {
void visit(InitClassInstruction insn); void visit(InitClassInstruction insn);
void visit(NullCheckInstruction insn); void visit(NullCheckInstruction insn);
void visit(MonitorEnterInstruction insn);
void visit(MonitorExitInstruction insn);
} }

View File

@ -0,0 +1,50 @@
/*
* Copyright 2013 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.model.instructions;
import org.teavm.model.Instruction;
import org.teavm.model.Variable;
/**
*
* @author shannah
*/
public class MonitorEnterInstruction extends Instruction {
private Variable objectRef;
@Override
public void acceptVisitor(InstructionVisitor visitor) {
visitor.visit(this);
}
/**
* @return the objectRef
*/
public Variable getObjectRef() {
return objectRef;
}
/**
* @param objectRef the objectRef to set
*/
public void setObjectRef(Variable objectRef) {
this.objectRef = objectRef;
}
}

View File

@ -0,0 +1,48 @@
/*
* Copyright 2013 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.model.instructions;
import org.teavm.model.Instruction;
import org.teavm.model.Variable;
/**
*
* @author shannah
*/
public class MonitorExitInstruction extends Instruction {
private Variable objectRef;
@Override
public void acceptVisitor(InstructionVisitor visitor) {
visitor.visit(this);
}
/**
* @return the objectRef
*/
public Variable getObjectRef() {
return objectRef;
}
/**
* @param objectRef the objectRef to set
*/
public void setObjectRef(Variable objectRef) {
this.objectRef = objectRef;
}
}

View File

@ -184,4 +184,18 @@ public abstract class BasicBlockMapper implements InstructionVisitor {
@Override @Override
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }

View File

@ -202,4 +202,14 @@ public class DefinitionExtractor implements InstructionVisitor {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
definedVariables = new Variable[] { insn.getReceiver() }; definedVariables = new Variable[] { insn.getReceiver() };
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }

View File

@ -204,4 +204,14 @@ public class InstructionTransitionExtractor implements InstructionVisitor {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
targets = null; targets = null;
} }
@Override
public void visit(MonitorEnterInstruction insn) {
targets = null;
}
@Override
public void visit(MonitorExitInstruction insn) {
targets = null;
}
} }

View File

@ -228,4 +228,18 @@ public abstract class InstructionVariableMapper implements InstructionVisitor {
insn.setReceiver(map(insn.getReceiver())); insn.setReceiver(map(insn.getReceiver()));
insn.setValue(map(insn.getValue())); insn.setValue(map(insn.getValue()));
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }

View File

@ -310,5 +310,15 @@ public class MissingItemsProcessor {
@Override @Override
public void visit(EmptyInstruction insn) { public void visit(EmptyInstruction insn) {
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
}; };
} }

View File

@ -206,4 +206,14 @@ public class UsageExtractor implements InstructionVisitor {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
usedVariables = new Variable[] { insn.getValue() }; usedVariables = new Variable[] { insn.getValue() };
} }
@Override
public void visit(MonitorEnterInstruction insn) {
usedVariables = new Variable[] {insn.getObjectRef() };
}
@Override
public void visit(MonitorExitInstruction insn) {
usedVariables = new Variable[] {insn.getObjectRef()};
}
} }

View File

@ -418,5 +418,15 @@ public class GlobalValueNumbering implements MethodOptimization {
insn.setValue(program.variableAt(val)); insn.setValue(program.variableAt(val));
bind(insn.getReceiver().getIndex(), "nullCheck @" + val); bind(insn.getReceiver().getIndex(), "nullCheck @" + val);
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
}; };
} }

View File

@ -379,6 +379,16 @@ public class LoopInvariantMotion implements MethodOptimization {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
canMove = true; canMove = true;
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }
private class CopyConstantVisitor implements InstructionVisitor { private class CopyConstantVisitor implements InstructionVisitor {
@ -561,5 +571,15 @@ public class LoopInvariantMotion implements MethodOptimization {
@Override @Override
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }
} }

View File

@ -248,5 +248,15 @@ public class UnusedVariableElimination implements MethodOptimization {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
requestUsage(insn.getReceiver()); requestUsage(insn.getReceiver());
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }
} }

View File

@ -204,5 +204,15 @@ public final class VariableEscapeAnalyzer {
@Override @Override
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }
} }

View File

@ -210,5 +210,15 @@ public final class VariableUsageGraphBuilder {
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
use(insn.getReceiver(), insn.getValue()); use(insn.getReceiver(), insn.getValue());
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }
} }

View File

@ -284,4 +284,14 @@ public class ClassRefsRenamer implements InstructionVisitor {
@Override @Override
public void visit(NullCheckInstruction insn) { public void visit(NullCheckInstruction insn) {
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
} }

View File

@ -447,5 +447,15 @@ public class SSATransformer {
insn.setValue(use(insn.getValue())); insn.setValue(use(insn.getValue()));
insn.setReceiver(define(insn.getReceiver())); insn.setReceiver(define(insn.getReceiver()));
} }
@Override
public void visit(MonitorEnterInstruction insn) {
}
@Override
public void visit(MonitorExitInstruction insn) {
}
}; };
} }

View File

@ -430,8 +430,7 @@ public class TeaVM implements TeaVMHost, ServiceRepository {
// Keep track of current running thread by overriding setTimeout // Keep track of current running thread by overriding setTimeout
sourceWriter.append("self.old_setTimeout=self.setTimeout;").softNewLine(); sourceWriter.append("function $rt_setTimeout(f,interval){").indent().softNewLine();
sourceWriter.append("self.setTimeout=function(f,interval){").indent().softNewLine();
MethodReference currentThreadRef = new MethodReference( MethodReference currentThreadRef = new MethodReference(
Thread.class, "currentThread", Thread.class); Thread.class, "currentThread", Thread.class);
MethodReference setCurrentThreadRef = new MethodReference( MethodReference setCurrentThreadRef = new MethodReference(
@ -445,7 +444,7 @@ public class TeaVM implements TeaVMHost, ServiceRepository {
sourceWriter.appendMethodBody(setCurrentThreadRef).append("("). sourceWriter.appendMethodBody(setCurrentThreadRef).append("(").
appendMethodBody(getMainThreadRef).append("());}").softNewLine(); appendMethodBody(getMainThreadRef).append("());}").softNewLine();
sourceWriter.outdent().append("};").softNewLine(); sourceWriter.outdent().append("};").softNewLine();
sourceWriter.append("self.old_setTimeout(callback, interval);").softNewLine(); sourceWriter.append("setTimeout(callback, interval);").softNewLine();
sourceWriter.outdent().append("};").softNewLine(); sourceWriter.outdent().append("};").softNewLine();
// END Thread stuff // END Thread stuff

View File

@ -416,7 +416,7 @@ function $rt_asyncAdapter(f) {
return $return($rt_asyncResult(result)); return $return($rt_asyncResult(result));
} }
} }
function $rt_rootInvocationAdapter(f) { function $rt_rootInvocationAdapter(f, extraArgs) {
return function() { return function() {
var args = Array.prototype.slice.apply(arguments); var args = Array.prototype.slice.apply(arguments);
if (extraArgs) { if (extraArgs) {