X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Forg%2Fibex%2Fjs%2FJSArray.java;h=d0cd550e333f5dca8d53fb4e40858e79a2840fc9;hb=85c8f402be33df8440511492fb597fba9c2eb45f;hp=d9ffad10dfe28b060e14897188dc99b7729caac1;hpb=ce791e4058158295bce9cf7b6698c2b565d571d7;p=org.ibex.core.git diff --git a/src/org/ibex/js/JSArray.java b/src/org/ibex/js/JSArray.java index d9ffad1..d0cd550 100644 --- a/src/org/ibex/js/JSArray.java +++ b/src/org/ibex/js/JSArray.java @@ -24,40 +24,38 @@ public class JSArray extends JS.BT { }*/ public JS callMethod(JS method, JS a0, JS a1, JS a2, JS[] rest, int nargs) throws JSExn { - if(isString(method)) { - //#switch(JS.toString(method)) - case "pop": { - int oldSize = size(); - if(oldSize == 0) return null; - return removeElementAt(oldSize-1); - } - case "reverse": return reverse(); - case "toString": return join(","); - case "shift": - if(length() == 0) return null; - return removeElementAt(0); - case "join": - return join(nargs == 0 ? "," : JS.toString(a0)); - case "sort": - return sort(nargs < 1 ? null : a0); - case "slice": - int start = toInt(nargs < 1 ? null : a0); - int end = nargs < 2 ? length() : toInt(a1); - return slice(start, end); - case "push": { - int oldSize = size(); - for(int i=0; i= size()) return null; return elementAt(i); } - if(isString(key)) { - //#switch(JS.toString(key)) - case "pop": return METHOD; - case "reverse": return METHOD; - case "toString": return METHOD; - case "shift": return METHOD; - case "join": return METHOD; - case "sort": return METHOD; - case "slice": return METHOD; - case "push": return METHOD; - case "unshift": return METHOD; - case "splice": return METHOD; - case "length": return N(size()); - //#end - } + //#jswitch(key) + case "pop": return METHOD; + case "reverse": return METHOD; + case "toString": return METHOD; + case "shift": return METHOD; + case "join": return METHOD; + case "sort": return METHOD; + case "slice": return METHOD; + case "push": return METHOD; + case "unshift": return METHOD; + case "splice": return METHOD; + case "length": return N(size()); + //#end return super.get(key); } @@ -95,6 +91,7 @@ public class JSArray extends JS.BT { if(i > oldSize) setSize(i); insertElementAt(val,i); } + return; } if(isString(key)) { if (JS.toString(key).equals("length")) { @@ -105,14 +102,12 @@ public class JSArray extends JS.BT { super.put(key,val); } - // FIXME: Needs to include super's keys - public Enumeration keys() { - return new Enumeration() { - private int n = size(); - public boolean hasMoreElements() { return n > 0; } - public Object nextElement() { - if(n == 0) throw new NoSuchElementException(); - return new Integer(--n); + public Enumeration keys() throws JSExn { + return new Enumeration(super.keys()) { + private int n = 0; + public boolean _hasMoreElements() { return n < size(); } + public JS _nextElement() { + return n >= size() ? null : JS.N(n++); } }; } @@ -127,8 +122,8 @@ public class JSArray extends JS.BT { public final int length() { return size(); } public final JS elementAt(int i) { if(i < 0 || i >= size()) throw new ArrayIndexOutOfBoundsException(i); - JS o = (JS) getNode(i); - return o == NULL ? null : o; + Object o = getNode(i); + return o == NULL ? (JS)null : (JS)o; } public final void addElement(JS o) { insertNode(size(),o==null ? NULL : o); @@ -143,8 +138,8 @@ public class JSArray extends JS.BT { } public final JS removeElementAt(int i) { if(i < 0 || i >= size()) throw new ArrayIndexOutOfBoundsException(i); - JS o = (JS) deleteNode(i); - return o == NULL ? null : o; + Object o = deleteNode(i); + return o == NULL ? (JS)null : (JS)o; } public final int size() { return treeSize(); } @@ -186,33 +181,31 @@ public class JSArray extends JS.BT { a.setElementAt(elementAt(start+i),i); return a; } - + private static final Vec.CompareFunc defaultSort = new Vec.CompareFunc() { public int compare(Object a, Object b) { try { return JS.toString((JS)a).compareTo(JS.toString((JS)b)); - } catch(JSExn e) { - // FIXME: See emca about this - throw new RuntimeException(e.toString()); - } + } catch(JSExn e) { throw new JSExn.Wrapper(e); } } }; private JS sort(JS tmp) throws JSExn { Vec vec = toVec(); - if(tmp instanceof JS) { - final JS jsFunc = (JS) tmp; - vec.sort(new Vec.CompareFunc() { - public int compare(Object a, Object b) { - try { - return JS.toInt(jsFunc.call((JS)a, (JS)b, null, null, 2)); - } catch (JSExn e) { - // FIXME: Check ecma to see what we should do here - throw new RuntimeException(e.toString()); + try { + if(tmp instanceof JS) { + final JS jsFunc = (JS) tmp; + vec.sort(new Vec.CompareFunc() { + public int compare(Object a, Object b) { + try { + return JS.toInt(jsFunc.call((JS)a, (JS)b, null, null, 2)); + } catch(JSExn e) { throw new JSExn.Wrapper(e); } } - } - }); - } else { - vec.sort(defaultSort); + }); + } else { + vec.sort(defaultSort); + } + } catch(JSExn.Wrapper e) { + throw e.refill(); } setFromVec(vec); return this;