return c == null || c.f == null ? null : c.f.sourceName;
}
- public static class PausedException extends Exception { PausedException() { } }
-
- public static void invokePauseable(JSFunction function) throws JS.PausedException, JSExn {
- Interpreter i = new Interpreter(function, true, new JSArray());
- int oldpausecount = i.pausecount;
- i.resume();
- if (i.pausecount > oldpausecount) throw new PausedException();
- }
-
public static class NotPauseableException extends Exception { NotPauseableException() { } }
/** returns a callback which will restart the context; expects a value to be pushed onto the stack when unpaused */
return new JS.UnpauseCallback(i);
}
- public static class UnpauseCallback {
+ public static class UnpauseCallback implements Scheduler.Task {
Interpreter i;
UnpauseCallback(Interpreter i) { this.i = i; }
+ public void perform() throws JSExn { unpause(null); }
public void unpause(Object o) throws JSExn {
// FIXME: if o instanceof JSExn, throw it into the JSworld
i.stack.push(o);
import java.io.*;
/** A JavaScript function, compiled into bytecode */
-public class JSFunction extends JS implements ByteCodes, Tokens {
+public class JSFunction extends JS implements ByteCodes, Tokens, org.xwt.Scheduler.Task {
// Fields and Accessors ///////////////////////////////////////////////
// Public //////////////////////////////////////////////////////////////////////////////
+ // FEATURE: make sure that this can only be called from the Scheduler...
+ /** if you enqueue a function, it gets invoked in its own pauseable context */
+ public void perform() throws JSExn {
+ Interpreter i = new Interpreter(this, true, new JSArray());
+ int oldpausecount = i.pausecount;
+ i.resume();
+ }
+
/** parse and compile a function */
public static JSFunction fromReader(String sourceName, int firstLine, Reader sourceCode) throws IOException {
JSFunction ret = new JSFunction(sourceName, firstLine, null);