X-Git-Url: http://git.megacz.com/?p=org.ibex.js.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fjs%2FJS.java;h=a7270482ea2ed6e323f2abf7ab18ae9d48dc23c2;hp=096e8f9bbb96ed46faaecde107f460f322729603;hb=aaf060ff38871512d80f1bbf04a6596648b284c7;hpb=a1e6b7e9307319c0195b0efbe5e5354c128be481 diff --git a/src/org/ibex/js/JS.java b/src/org/ibex/js/JS.java index 096e8f9..a727048 100644 --- a/src/org/ibex/js/JS.java +++ b/src/org/ibex/js/JS.java @@ -41,9 +41,6 @@ public interface JS extends Pausable { * This function must never return a null object. */ public String[] getFormalArgs(); - /** Returns true if the specific key is found in this object. */ - public boolean hasKey(JS key); - /** Put a value to the given key, calling any write traps that have * been placed on the key. * @@ -92,16 +89,15 @@ public interface JS extends Pausable { public InputStream getInputStream() throws IOException, JSExn { throw new JSExn( "object has not associated stream, class ["+ getClass().getName() +"]"); } - public boolean hasKey(JS key) { return false; } - public Object run(Object o) throws Exception { throw new JSExn( "object cannot be called, class ["+ getClass().getName() +"]"); } public void pause() { throw new NotPausableException(); } - 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: " + JSU.str(method)); } + 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 { + if (method == null) return call(args); + throw new JSExn("method not found: " + JSU.str(method) + " class="+this.getClass().getName()); + } public String[] getFormalArgs() { return emptystr; } public void declare(JS key) throws JSExn { throw new JSExn( @@ -149,8 +145,6 @@ public interface JS extends Pausable { public JS call(JS[] a) throws JSExn { return clonee.call(a); } public String[] getFormalArgs() { return clonee.getFormalArgs(); } - public boolean hasKey(JS k) { return clonee.hasKey(k); } - public JS putAndTriggerTraps(JS k, JS v) throws JSExn { return clonee.putAndTriggerTraps(k, v); } public JS getAndTriggerTraps(JS k) throws JSExn { @@ -174,13 +168,12 @@ public interface JS extends Pausable { * entries[index + 1] // value * entries[index + 2] // trap */ - protected final int indexmultiple = 3; protected void entryAdded(int p) {} protected void entryUpdated(int p) {} protected void entryRemoved(int p) {} - public Obj() { super(4, 0.75F); } + public Obj() { super(3, 4, 0.75F); } public JS unclone() { return this; } public InputStream getInputStream() throws IOException, JSExn { throw new JSExn( @@ -220,7 +213,6 @@ public interface JS extends Pausable { if (val == null) entries[dest + 1] = holder; else entries[dest + 1] = val; } - public boolean hasKey(JS key) { return indexOf(key) >= 0; } /*public boolean hasValue(JS key, JS value) { int i = indexOf(key); return i >= 0 && entries[i + 1] != null; } public boolean hasTrap(JS key, JS trap) { @@ -235,13 +227,15 @@ public interface JS extends Pausable { if (t != null && (t = t.write()) != null) { val = (JS)new Interpreter(t, val, false).run(null); } + put(key, val); // HACK: necessary for subclasses overriding put() + /*if (i < 0) i = put(i, key); if (val == null) entries[i + 1] = holder; - else entries[i + 1] = val; + else entries[i + 1] = val;*/ return val; } public JS getAndTriggerTraps(JS key) throws JSExn { Trap t = null; int i = indexOf(key); - if (i < 0) return null; + if (i < 0) return get(key); // HACK: necessary for subclasses overriding get() t = (Trap)entries[i + 2]; return t == null ? (JS)entries[i + 1] : (JS)new Interpreter(t, null, false).run(null); }