jswitch
[org.ibex.core.git] / src / org / ibex / js / JSArray.java
index d9ffad1..d0cd550 100644 (file)
@@ -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<nargs; i++) insertElementAt(i==0?a0:i==1?a1:i==2?a2:rest[i-3],oldSize+i);
-                return N(oldSize + nargs);
-            }
-            case "unshift":
-                for(int i=0; i<nargs; i++) insertElementAt(i==0?a0:i==1?a1:i==2?a2:rest[i-3],i);
-                return N(size());
-            case "splice":
-                JSArray array = new JSArray();
-                for(int i=0; i<nargs; i++) array.addElement(i==0?a0:i==1?a1:i==2?a2:rest[i-3]);
-                return splice(array);
-            //#end
+        //#jswitch(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<nargs; i++) insertElementAt(i==0?a0:i==1?a1:i==2?a2:rest[i-3],oldSize+i);
+            return N(oldSize + nargs);
+        }
+        case "unshift":
+            for(int i=0; i<nargs; i++) insertElementAt(i==0?a0:i==1?a1:i==2?a2:rest[i-3],i);
+            return N(size());
+        case "splice":
+            JSArray array = new JSArray();
+            for(int i=0; i<nargs; i++) array.addElement(i==0?a0:i==1?a1:i==2?a2:rest[i-3]);
+            return splice(array);
+        //#end
         return super.callMethod(method, a0, a1, a2, rest, nargs);
     }
         
@@ -67,21 +65,19 @@ public class JSArray extends JS.BT {
             if (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;