Fix Thread.start()

This commit is contained in:
konsoletyper 2015-02-14 00:41:29 +04:00
parent f93b35ce80
commit 4cf084d848
4 changed files with 41 additions and 16 deletions

View File

@ -19,6 +19,7 @@ import org.teavm.dom.browser.TimerHandler;
import org.teavm.dom.browser.Window; import org.teavm.dom.browser.Window;
import org.teavm.javascript.spi.Async; import org.teavm.javascript.spi.Async;
import org.teavm.jso.JS; import org.teavm.jso.JS;
import org.teavm.platform.Platform;
import org.teavm.platform.async.AsyncCallback; import org.teavm.platform.async.AsyncCallback;
@ -56,23 +57,20 @@ public class TThread extends TObject implements TRunnable {
} }
public void start(){ public void start(){
window.setTimeout(new TimerHandler() { Platform.startThread(new Runnable() {
@Override public void onTimer() { @Override
launch(TThread.this); public void run() {
}
}, 0);
}
private static void launch(TThread thread) {
try { try {
activeCount++; activeCount++;
setCurrentThread(thread); setCurrentThread(TThread.this);
thread.run(); target.run();
} finally { } finally {
activeCount--; activeCount--;
setCurrentThread(mainThread); setCurrentThread(mainThread);
} }
} }
});
}
static void setCurrentThread(TThread thread){ static void setCurrentThread(TThread thread){
currentThread = thread; currentThread = thread;

View File

@ -92,6 +92,14 @@ public final class Platform {
@PluggableDependency(PlatformGenerator.class) @PluggableDependency(PlatformGenerator.class)
public static native Enum<?>[] getEnumConstants(PlatformClass cls); public static native Enum<?>[] getEnumConstants(PlatformClass cls);
@GeneratedBy(PlatformGenerator.class)
@PluggableDependency(PlatformGenerator.class)
public static native void startThread(Runnable runnable);
private static void launchThread(Runnable runnable) {
runnable.run();
}
public static PlatformString stringFromCharCode(int charCode) { public static PlatformString stringFromCharCode(int charCode) {
return ((PlatformHelper)JS.getGlobal()).getStringClass().fromCharCode(charCode); return ((PlatformHelper)JS.getGlobal()).getStringClass().fromCharCode(charCode);
} }

View File

@ -38,7 +38,7 @@ public class AsyncMethodGenerator implements Generator, DependencyPlugin {
@Override @Override
public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException {
MethodReference asyncRef = getAsyncReference(methodRef); MethodReference asyncRef = getAsyncReference(methodRef);
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($this,").ws() writer.append("callback.").appendMethod(completeMethod).ws().append("=").ws().append("function($this,").ws()
.append("val)").ws().append("{").indent().softNewLine(); .append("val)").ws().append("{").indent().softNewLine();
writer.append("return $return($rt_asyncResult(val));").softNewLine(); writer.append("return $return($rt_asyncResult(val));").softNewLine();

View File

@ -25,6 +25,7 @@ import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.javascript.spi.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.spi.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.platform.Platform;
/** /**
* *
@ -40,6 +41,13 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
case "clone": case "clone":
method.getVariable(1).connect(method.getResult()); method.getVariable(1).connect(method.getResult());
break; break;
case "startThread": {
MethodDependency launchMethod = agent.linkMethod(new MethodReference(Platform.class,
"launchThread", Runnable.class, void.class), null);
method.getVariable(1).connect(launchMethod.getVariable(1));
launchMethod.use();
break;
}
} }
} }
@ -69,6 +77,9 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
case "clone": case "clone":
generateClone(context, writer); generateClone(context, writer);
break; break;
case "startThread":
generateStartThread(context, writer);
break;
} }
} }
@ -117,4 +128,12 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
.softNewLine().outdent().append("}").softNewLine(); .softNewLine().outdent().append("}").softNewLine();
writer.append("return copy;").softNewLine(); writer.append("return copy;").softNewLine();
} }
private void generateStartThread(GeneratorContext context, SourceWriter writer) throws IOException {
String runnable = context.getParameterName(1);
writer.append("window.setTimeout(function()").ws().append("{").indent().softNewLine();
writer.appendMethodBody(Platform.class, "launchThread", Runnable.class, void.class).append("(")
.append(runnable).append(");").softNewLine();
writer.outdent().append("},").ws().append("0);").softNewLine();
}
} }