return (JS)new Interpreter(t, val, true).run(null);
}
- /** returns a callback which will restart the context; expects a value to be pushed onto the stack when unpaused */
- public static UnpauseCallback pause() throws NotPauseableException {
- Interpreter i = Interpreter.current();
- if (i.pausecount == -1) throw new NotPauseableException();
- boolean get;
- switch(i.f.op[i.pc]) {
- case Tokens.RETURN: case ByteCodes.PUT: get = false; break;
- case ByteCodes.GET: case ByteCodes.CALL: get = true; break;
- default: throw new Error("should never happen");
+ public void addTrap(JS key, JS f) throws JSExn {
+ if (f.getFormalArgs() == null || f.getFormalArgs().length > 1) throw new JSExn(
+ "traps must take either one argument (write) or no arguments (read)");
+ int i = indexOf(key); if (i < 0) i = put(i, key);
+ for (Trap t = (Trap)entries[i + 2]; t != null; t = t.next())
+ if (t.function().equals(f)) return;
+ entries[i + 2] = new TrapHolder(this, key, f, (Trap)entries[i + 2]);
}
public void delTrap(JS key, JS f) throws JSExn {