moved ProxyAutoConfig.java from org.ibex.net.HTTP to this package
[org.ibex.js.git] / src / org / ibex / js / JSArray.java
index cb06d0d..e8529c6 100644 (file)
@@ -8,26 +8,26 @@ import java.io.InputStream;
 import org.ibex.util.*; 
 
 /** A JavaScript JSArray */
-class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
+public class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
     private static final JS.Method METHOD = new JS.Method();
     private static final String[] empty = new String[0];
 
-    JSArray() { }
-    JSArray(int size) { super(size); }
-    JSArray(JS[] args) { super(args.length); addAll(args); }
-    JSArray(JS arg) { super(1); add(arg); }
+    public JSArray() { }
+    public JSArray(int size) { super(size); }
+    public JSArray(JS[] args) { super(args.length); addAll(args); }
+    public JSArray(JS arg) { super(1); add(arg); }
 
     public JS unclone() { return this; }
     public JS.Enumeration keys() throws JSExn {
         return new Enumeration(null) {
             private int n = 0;
             public boolean _hasNext() { return n < size(); }
-            public JS _next() { return Script.N(n++); }
+            public JS _next() { return JSU.N(n++); }
         };
     }
     public JS get(JS key) throws JSExn {
         if (key == null || !(key instanceof JSNumber.I)) {
-            //#switch(Script.str(key))
+            //#switch(JSU.str(key))
             case "pop": return METHOD;
             case "reverse": return METHOD;
             case "toString": return METHOD;
@@ -38,56 +38,46 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
             case "push": return METHOD;
             case "unshift": return METHOD;
             case "splice": return METHOD;
-            case "length": return Script.N(size());
+            case "length": return JSU.N(size());
             //#end
-            throw new JSExn("arrays only support positive integer keys, can not use: "+Script.str(key));
+            throw new JSExn("arrays only support positive integer keys, can not use: "+JSU.str(key));
         }
         return (JS)get(((JSNumber.I)key).toInt());
     }
     public void put(JS key, JS val) throws JSExn {
-        if (Script.str(key).equals("length")) { setSize(Script.toInt(val)); }
+        if (JSU.str(key).equals("length")) { setSize(JSU.toInt(val)); }
 
         if (key == null || !(key instanceof JSNumber.I)) throw new JSExn(
-            "arrays only support positive integer keys, can not use: "+Script.str(key));
+            "arrays only support positive integer keys, can not use: "+JSU.str(key));
         int i = ((JSNumber.I)key).toInt();
         if (i < 0) throw new JSExn("arrays can not use negative integer keys "+i);
-        size(i + 1); while (size() < i) add(null);
+        if (size() < i+1) size(i + 1);
+       //while (size() < i) add(null);
         set(i, val);
     }
-    public InputStream getInputStream() { return null; }
 
     public String[] getFormalArgs() { return empty; }
-    public String coerceToString() { return "array"; } // FIXME
+    public String coerceToString() throws JSExn { throw new JSExn("cannot coerce a "+getClass().getName()+" to a string"); }
 
-    public boolean hasKey(JS key) {
-        if (key == null || !(key instanceof JSNumber.I)) return false;
-        int i = ((JSNumber.I)key).toInt();
-        return 0 <= i && i < size();
-    }
-
-    public Object run(Object o) throws JSExn { return call(null); }
-    public void pause() throws NotPausableException { throw new NotPausableException(); }
-    public JS call(JS[] args) throws JSExn { throw new JSExn("can not call an array as a function"); }
     public JS call(JS method, JS[] args) throws JSExn {
-        //#switch(Script.str(method))
+        //#switch(JSU.str(method))
         case "pop": return size() == 0 ? null : (JS)remove(size() - 1);
-        case "push": addAll(args); return Script.N(size());
+        case "push": addAll(args); return JSU.N(size());
         case "reverse": reverse(); return this;
         case "toString": return join(",");
         case "shift": return size() == 0 ? null : (JS)remove(0);
-        case "join": return join(args.length == 0 ? "," : Script.str(args[0]));
+        case "join": return join(args.length == 0 ? "," : JSU.str(args[0]));
         case "sort": return sort(args.length == 0 ? null : args[0]);
         case "slice":
-            int start = Script.toInt(args.length < 1 ? null : args[0]);
-            int end = args.length < 2 ? size() : Script.toInt(args[1]);
+            int start = JSU.toInt(args.length < 1 ? null : args[0]);
+            int end = args.length < 2 ? size() : JSU.toInt(args[1]);
             return slice(start, end);
         case "unshift":
             for (int i=0; i < args.length; i++) add(i, args[i]);
-            return Script.N(size());
+            return JSU.N(size());
         case "splice": return splice(args);
         //#end
-
-        throw new JSExn("arrays have no function: "+Script.str(method));
+        throw new JSExn("arrays have no function: "+JSU.str(method));
     }
 
     public JS putAndTriggerTraps(JS key, JS val) throws JSExn { put(key, val); return val; }
@@ -96,9 +86,9 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
 
     public void addTrap(JS k, JS f) throws JSExn { throw new JSExn("arrays do not support traps"); }
     public void delTrap(JS k, JS f) throws JSExn { throw new JSExn("arrays do not support traps"); }
-    public JS.Trap getTrap(JS k) throws JSExn { throw new JSExn("arrays do not support traps"); }
+    public JS.Trap getTrap(JS k) throws JSExn { return null; }
 
-    /** FIXME: move to specialised ArrayStore superclass. */
+    /** FEATURE: move to specialised ArrayStore superclass. */
     public void addAll(JS[] entries) { for (int i=0; i < entries.length; i++) add(entries[i]); }
 
     public void setSize(int newSize) {
@@ -112,16 +102,16 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
 
     private JS join(String sep) throws JSExn {
         int length = size();
-        if(length == 0) return JS.S("");
+        if(length == 0) return JSU.S("");
         StringBuffer sb = new StringBuffer(64);
         int i=0;
         while(true) {
             JS o = (JS)get(i);
-            if(o != null) sb.append(Script.toString(o));
+            if(o != null) sb.append(JSU.toString(o));
             if(++i == length) break;
             sb.append(sep);
         }
-        return JS.S(sb.toString());
+        return JSU.S(sb.toString());
     }
  
     private JS slice(int start, int end) {
@@ -133,15 +123,15 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
         if(start > length) start = length;
         if(end > length) end = length;
         JSArray a = new JSArray(end-start);
-        for(int i=0;i<end-start;i++) // FIXME: with ArrayStore do System.arraycopy()
+        for(int i=0;i<end-start;i++) // FEATURE: with ArrayStore do System.arraycopy()
             a.set(i, get(start+i));
         return a;
     }
 
     private JS splice(JS[] args) throws JSExn {
         int oldLength = size();
-        int start = Script.toInt(args.length < 1 ? null : args[0]);
-        int deleteCount = Script.toInt(args.length < 2 ? null : args[1]);
+        int start = JSU.toInt(args.length < 1 ? null : args[0]);
+        int deleteCount = JSU.toInt(args.length < 2 ? null : args[1]);
         int newCount = args.length - 2;
         if(newCount < 0) newCount = 0;
         if(start < 0) start = oldLength+start;
@@ -152,7 +142,7 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
         int newLength = oldLength - deleteCount + newCount;
         int lengthChange = newLength - oldLength;
         JSArray ret = new JSArray(deleteCount);
-        for(int i=0;i<deleteCount;i++) // FIXME: ArrayStore System.arraycopy()
+        for(int i=0;i<deleteCount;i++) // FEATURE: ArrayStore System.arraycopy()
             ret.set(i, get(start+i));
         if(lengthChange > 0) {
             setSize(newLength);
@@ -170,7 +160,7 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
 
     private static final Basket.CompareFunc defaultSort = new Basket.CompareFunc() {
         public int compare(Object a, Object b) {
-            try { return Script.toString((JS)a).compareTo(Script.toString((JS)b)); }
+            try { return JSU.toString((JS)a).compareTo(JSU.toString((JS)b)); }
             catch (JSExn e) { throw new JSExn.Wrapper(e); }
         }
     };
@@ -188,7 +178,7 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc {
     public int compare(Object a, Object b) throws JSExn.Wrapper {
         try {
             sortargs[0] = (JS)a; sortargs[1] = (JS)b;
-            return Script.toInt(sort.call(sortargs));
+            return JSU.toInt(sort.call(null, sortargs));
         } catch (JSExn e) { throw new JSExn.Wrapper(e);
         } finally { sortargs[0] = null; sortargs[1] = null; }
     }