2003/11/17 01:53:25
[org.ibex.core.git] / src / org / xwt / js / JSArray.java
index 880e64f..c918bda 100644 (file)
@@ -22,49 +22,62 @@ public class JSArray extends JSCallable {
         return Integer.parseInt(s);
     }
     
-    public Object call(Object method, JSArray args) {
-        if(method.equals("push")) {
-            for(int i=0;i<args.length();i++)
-                vec.push(args.elementAt(i));
-            return new Integer(vec.size());
-        }
-        if(method.equals("pop")) {
-            return vec.pop(); // this'll return null on size()==0 
-        }
-        if(method.equals("shift")) {
-            if(length() > 0) {
-                Object o = vec.elementAt(0);
-                vec.removeElementAt(0);
-                return o;
-            } else {
-                return null;
-            }
-        }
-        if(method.equals("unshift")) {
-            // FEATURE: could be optimized a bit with some help from Vec
-            for(int i=0;i<args.length();i++)
-                vec.insertElementAt(args.elementAt(i),i);
-            return new Integer(vec.size());
-        }
-        if(method.equals("slice")) return slice(args);
-        if(method.equals("join")) return join(args);
-        if(method.equals("reverse")) return reverse(args);
-        if(method.equals("toString")) return join(",");
-        if(method.equals("sort")) return sort(args);
-        if(method.equals("splice")) return splice(args);
-        throw new JS.Exn("unknown method " + method);
+    public Object callMethod(Object method, Object a0, Object a1, Object a2, Object[] rest, int nargs) {
+        //#switch(method)
+        case "pop": return vec.pop();
+        case "reverse": return reverse();
+        case "toString": return join(",");
+        case "shift":
+            if(length() == 0) return null;
+            Object o = vec.elementAt(0);
+            vec.removeElementAt(0);
+            return o;
+        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":
+            for(int i=0; i<nargs; i++) vec.push(i==0?a0:i==1?a1:i==2?a2:rest[i-3]);
+            return N(vec.size());
+        case "unshift":
+            for(int i=0; i<nargs; i++) vec.insertElementAt(i==0?a0:i==1?a1:i==2?a2:rest[i-3], i);
+            return N(vec.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);
     }
         
     public Object get(Object key) throws JS.Exn {
-        if (key.equals("length")) return new Long(vec.size());
-                
-        int i = intVal(key);
-        if (i == Integer.MIN_VALUE) return super.get(key);
-        try {
-            return vec.elementAt(i);
-        } catch (ArrayIndexOutOfBoundsException e) {
-            return null;
+        if (key instanceof Number) {
+            int i = intVal(key);
+            if (i == Integer.MIN_VALUE) return super.get(key);
+            try {
+                return vec.elementAt(i);
+            } catch (ArrayIndexOutOfBoundsException e) {
+                return null;
+            }
         }
+        //#switch(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(vec.size());
+        //#end
+        return super.get(key);
     }
 
     public void put(Object key, Object val) {
@@ -96,10 +109,6 @@ public class JSArray extends JSCallable {
     public int size() { return vec.size(); }
     public String typeName() { return "array"; }
         
-    private Object join(JSArray args) {
-        return join(args.length() == 0 ? "," : JS.toString(args.elementAt(0)));
-    }
-    
     private Object join(String sep) {
         int length = vec.size();
         if(length == 0) return "";
@@ -114,20 +123,17 @@ public class JSArray extends JSCallable {
         return sb.toString();
     }
     
-    private Object reverse(JSArray args) {
+    private Object reverse() {
         Vec oldVec = vec;
         int size = oldVec.size();
         if(size < 2) return this;
         vec = new Vec(size);
-        for(int i=size-1;i>=0;i--)
-            vec.addElement(oldVec.elementAt(i));
+        for(int i=size-1;i>=0;i--) vec.addElement(oldVec.elementAt(i));
         return this;
     }
     
-    private Object slice(JSArray args) {
+    private Object slice(int start, int end) {
         int length = length();
-        int start = JS.toInt(args.length() < 1 ? null : args.elementAt(0));
-        int end = args.length() < 2 ? length : JS.toInt(args.elementAt(1));
         if(start < 0) start = length+start;
         if(end < 0) end = length+end;
         if(start < 0) start = 0;
@@ -145,8 +151,7 @@ public class JSArray extends JSCallable {
             return JS.toString(a).compareTo(JS.toString(b));
         }
     };
-    private Object sort(JSArray args) {
-        Object tmp = args.length() < 1 ? null : args.elementAt(0);
+    private Object sort(Object tmp) {
         if(tmp instanceof JSCallable) {
             final JSArray funcArgs = new JSArray(2);
             final JSCallable jsFunc = (JSCallable) tmp;
@@ -154,7 +159,7 @@ public class JSArray extends JSCallable {
                 public int compare(Object a, Object b) {
                     funcArgs.setElementAt(a,0);
                     funcArgs.setElementAt(b,1);
-                    return JS.toInt(jsFunc.call(null, funcArgs));
+                    return JS.toInt(jsFunc.call(a, b, null, null, 2));
                 }
             });
         } else {