X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fjs%2FJSArray.java;h=7d1e71dca7139381544d340dda012a8f462f606b;hb=f3ad8b6cba43f3c5364dc2cd9f1d050c1f48f167;hp=cb06d0de60d6c55cffc1928d9c219980130069cc;hpb=f1f7558304af1598272d935d46cab637aa001ef5;p=org.ibex.js.git diff --git a/src/org/ibex/js/JSArray.java b/src/org/ibex/js/JSArray.java index cb06d0d..7d1e71d 100644 --- a/src/org/ibex/js/JSArray.java +++ b/src/org/ibex/js/JSArray.java @@ -8,7 +8,7 @@ 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]; @@ -22,12 +22,12 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc { 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,45 @@ 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); 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; } @@ -98,7 +87,7 @@ class JSArray extends Basket.Array implements JS, Basket.CompareFunc { 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"); } - /** 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 +101,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 +122,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 0) { setSize(newLength); @@ -170,7 +159,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 +177,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; } }