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) {
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 "";
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;
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;
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 {