X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fjs%2FJS.java;h=9bd8abcf4a5acd34c03f9bc98db52ea906aad99d;hb=a6fb49b55117ea4cf330b412d2a2fff403fcd053;hp=782b445f20a595c1f87faca1ab2f1a79b56655a6;hpb=9fdbf84caf2cf66993d893c656668aafe2af6037;p=org.ibex.js.git diff --git a/src/org/ibex/js/JS.java b/src/org/ibex/js/JS.java index 782b445..9bd8abc 100644 --- a/src/org/ibex/js/JS.java +++ b/src/org/ibex/js/JS.java @@ -9,7 +9,7 @@ import java.io.*; 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; @@ -55,7 +55,7 @@ public interface JS extends Pausable { 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; @@ -79,22 +79,17 @@ public interface JS extends Pausable { 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 {} @@ -121,18 +116,17 @@ public interface JS extends Pausable { 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(); @@ -157,7 +151,7 @@ public interface JS extends Pausable { } 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); @@ -166,8 +160,8 @@ public interface JS extends Pausable { } 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); @@ -183,8 +177,7 @@ public interface JS extends Pausable { 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 {} @@ -214,8 +207,7 @@ public interface JS extends Pausable { 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(); } @@ -229,6 +221,7 @@ public interface JS extends Pausable { private final Enumeration parent; + public Enumeration() { this(null); } public Enumeration(Enumeration parent) { this.parent = parent; } protected abstract boolean _hasNext(); @@ -255,13 +248,20 @@ public interface JS extends Pausable { 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;