public JS call(JS[] args) throws JSExn { throw new JSExn(
"object cannot be called, class ["+ getClass().getName() +"]"); }
public JS call(JS method, JS[] args) throws JSExn { throw new JSExn(
- "method not found: " + Script.str(method)); }
+ "method not found: " + JSU.str(method)); }
public String[] getFormalArgs() { return emptystr; }
public void declare(JS key) throws JSExn { throw new JSExn(
- "object cannot declare key: "+ Script.str(key)); }
+ "object cannot declare key: "+ JSU.str(key)); }
public void undeclare(JS key) throws JSExn { } // FIXME throw error?
public JS putAndTriggerTraps(JS key, JS val) throws JSExn { throw new JSExn(
private static final String[] emptystr = new String[0];
private static final Placeholder holder = new Placeholder();
+ // HACK: this is hideously, disgustingly ugly.... we need N-ary Hash classes
/** entries[index + 0] // key
* entries[index + 1] // value
* entries[index + 2] // trap
public JS call(JS[] args) throws JSExn { throw new JSExn(
"object cannot be called, class ["+ getClass().getName() +"]"); }
public JS call(JS method, JS[] args) throws JSExn { throw new JSExn(
- "method not found: " + Script.str(method)); }
+ "method not found: " + JSU.str(method)); }
public String[] getFormalArgs() { return emptystr; }
public Enumeration keys() throws JSExn {
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 {
}
public JS get(JS key) throws JSExn {
- //#switch(Script.str(key))
- case "hasNext": return Script.B(hasNext());
+ //#switch(JSU.str(key))
+ case "hasNext": return JSU.B(hasNext());
case "next": return next();
//#end
return super.get(key);