import java.util.*;
/** The minimum set of functionality required for objects which are manipulated by JavaScript */
-public interface JS extends Pausable {
+public interface JS {
/** Returns an enumeration of the keys in this object. */
public JS.Enumeration keys() throws JSExn;
public void delTrap(JS key, JS function) throws JSExn;
public Trap getTrap(JS key) throws JSExn;
- // FIXME: consider renaming/removing these
+ // FEATURE: consider renaming/removing these
public JS unclone();
public String coerceToString() throws JSExn;
throw new JSExn("method not found: " + JSU.str(method) + " class="+this.getClass().getName());
}
public String[] getFormalArgs() { return emptystr; }
+ public String coerceToString() throws JSExn { throw new JSExn("cannot coerce a "+getClass().getName()+" to a string"); }
- public JS putAndTriggerTraps(JS key, JS val) throws JSExn { throw new JSExn(
- "'" + key + "' is trap read only on class ["+ getClass().getName() +"]"); }
- public JS getAndTriggerTraps(JS key) throws JSExn { return null; } // FIXME throw errors?
+ public JS putAndTriggerTraps(JS key, JS val) throws JSExn {
+ throw new JSExn("'" + key + "' is trap read only on class ["+ getClass().getName() +"]"); }
+ public JS getAndTriggerTraps(JS key) throws JSExn { return null; }
public JS justTriggerTraps(JS key, JS value) throws JSExn { return null; }
-
public void addTrap(JS key, JS function) throws JSExn {
Log.warn(this, "'" + JSU.str(key) + "' is not trappable on class ["+ getClass().getName() +"]"); }
public void delTrap(JS key, JS function) throws JSExn {
Log.warn(this, "'" + JSU.str(key) + "' trap is read only on class ["+ getClass().getName() +"]"); }
- public Trap getTrap(JS key) throws JSExn {
- //Log.warn(this, "'" + JSU.str(key) + "' is not trappable on class ["+ getClass().getName() +"]");
- return null;
- }
- public String coerceToString() throws JSExn {
- throw new JSExn("cannot coerce a " + getClass().getName() + " to a string"); }
+ public Trap getTrap(JS key) throws JSExn { return null; }
}
public interface Cloneable {}
public String coerceToString() throws JSExn { return clonee.coerceToString(); }
}
- public static class Obj extends Basket.HashMap implements JS {
+ public static class Obj extends Basket.Hash implements JS {
private static final String[] emptystr = new String[0];
private static final Placeholder holder = new Placeholder();
public Obj() { super(3, 4, 0.75F); }
public JS unclone() { return this; }
+ public String[] getFormalArgs() { return emptystr; }
public JS call(JS method, JS[] args) throws JSExn {
- if (method==null) throw new JSExn("cannot call a " + getClass().getName());
- throw new JSExn("method not found: " + JSU.str(method)); }
- public String[] getFormalArgs() { return emptystr; }
+ throw new JSExn(method==null ? "cannot call a " + getClass().getName() : "method not found: " + JSU.str(method)); }
public Enumeration keys() throws JSExn {
final Object[] keys = super.dumpkeys();
}
public JS getAndTriggerTraps(JS key) throws JSExn {
Trap t = (Trap)super.get(key, 1);
- return t == null ? (JS)super.get(key) : (JS)new Interpreter(t, null, false).run(null);
+ return t == null ? (JS)get(key) : (JS)new Interpreter(t, null, false).run(null);
}
public JS justTriggerTraps(JS key, JS val) throws JSExn {
Trap t = (Trap)super.get(key, 1);
}
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)");
+ if (f.getFormalArgs() == null || f.getFormalArgs().length > 1)
+ throw new JSExn("traps must take either one argument (write) or no arguments (read)");
for (Trap t = (Trap)super.get(key, 1); t != null; t = t.next())
if (t.function().equals(f)) return;
super.put(key, new TrapHolder(this, key, f, (Trap)super.get(key, 1)), 1);
public Trap getTrap(JS key) throws JSExn { return (Trap)super.get(key, 1); }
- public String coerceToString() throws JSExn {
- throw new JSExn("cannot coerce a " + getClass().getName() + " to a string"); }
+ public String coerceToString() throws JSExn { throw new JSExn("cannot coerce a "+getClass().getName()+" to a string"); }
private static final class Placeholder implements Serializable {}
public Trap next();
public Trap nextRead();
public Trap nextWrite();
-
- public Trap read(); // FIXME reconsider these function names
+ public Trap read(); // FEATURE reconsider these function names
public Trap write();
}
private final Enumeration parent;
+ public Enumeration() { this(null); }
public Enumeration(Enumeration parent) { this.parent = parent; }
protected abstract boolean _hasNext();
protected JS _next() { throw new NoSuchElementException(); }
}
- public static final class JavaIterator extends Enumeration {
- private final Iterator i;
+ public static class JavaIterator extends Enumeration {
+ protected final Iterator i;
public JavaIterator(Enumeration parent, Iterator i) { super(parent); this.i = i; }
protected boolean _hasNext() { return i.hasNext(); }
protected JS _next() { return (JS)i.next(); }
}
+ public static class JavaStringEnumeration extends Enumeration {
+ protected final java.util.Enumeration e;
+ public JavaStringEnumeration(java.util.Enumeration e) { this.e = e; }
+ protected boolean _hasNext() { return e.hasMoreElements(); }
+ protected JS _next() { return JSU.S(e.nextElement().toString()); }
+ }
+
public static final class RandomAccessList extends Enumeration {
private final List l;
private int pos = 0, size;