import java.io.*;
public class Test extends JS {
+ static JS.UnpauseCallback up = null;
+ static String action;
+
public static void main(String[] args) throws Exception {
if(args.length == 0) { System.err.println("Usage Test filename"); System.exit(1); }
- JS f = JS.fromReader(args[0],0,new FileReader(args[0]));
+ JS f = JS.fromReader(args[0],1,new FileReader(args[0]));
System.out.println(((JSFunction)f).dump());
- JSScope s = new JSScope(null);
+ JSScope s = new JSScope(new JSScope.Global());
s.put(JS.S("sys"),new Test());
f = JS.cloneWithNewParentScope(f,s);
- JS ret = f.call(null,null,null,null,0);
+ //JS ret = f.call(null,null,null,null,0);
+ Interpreter i = new Interpreter((JSFunction)f, true, new JSArray());
+ JS ret = i.resume();
+ while(up != null) {
+ JS.UnpauseCallback up = Test.up; Test.up = null;
+ if("throw".equals(action)) ret = up.unpause(new JSExn("this was thrown to a paused context"));
+ else if("bgget".equals(action)) ret = up.unpause(JS.S("I'm returning this from a get request"));
+ else {
+ System.out.println("got a background put " + action);
+ ret = up.unpause();
+ }
+ }
System.out.println("Script returned: " + JS.toString(ret));
}
public JS get(JS key) throws JSExn {
if(!JS.isString(key)) return null;
if("print".equals(JS.toString(key))) return METHOD;
+ if("bgget".equals(JS.toString(key))) {
+ action = "bgget";
+ try {
+ up = JS.pause();
+ } catch(NotPauseableException e) {
+ throw new Error("should never happen");
+ }
+ return null;
+ }
return super.get(key);
}
+
+ public void put(JS key, JS val) throws JSExn {
+ if("bgput".equals(JS.toString(key))) {
+ action = JS.toString(val);
+ try {
+ up = JS.pause();
+ } catch(NotPauseableException e) {
+ throw new Error("should never happen");
+ }
+ return;
+ }
+ super.put(key,val);
+ }
public JS callMethod(JS method, JS a0, JS a1, JS a2, JS[] rest, int nargs) throws JSExn {
if(!JS.isString(method)) return null;