package org.ibex.js;
-import org.ibex.util.*;
-import java.io.*;
-import java.util.*;
import java.lang.reflect.*;
/** Automatic JS-ification via Reflection (not for use in the core) */
-public class JSReflection extends JS {
+public class JSReflection extends JS.Immutable {
+ private static final JS.Method METHOD = new JS.Method();
public static JS wrap(Object o) throws JSExn {
if (o == null) return null;
throw new JSExn("Reflection object tried to return a " + o.getClass().getName());
}
- public static class Array extends JS {
+ public static class Array extends JS.Immutable {
final Object[] arr;
public Array(Object[] arr) { this.arr = arr; }
// FEATURE: Add a JSCounterEnumeration
public Enumeration keys() throws JSExn {
return new Enumeration(null) {
private int n = 0;
- public boolean _hasMoreElements() { return n < arr.length; }
- public JS _nextElement() {
- return n >= arr.length ? null : Script.N(n++);
- }
+ public boolean _hasNext() { return n < arr.length; }
+ public JS _next() { return Script.N(n++); }
};
}
- public JS get(JS key) throws JSExn { return wrap(arr[toInt(key)]); }
- public void put(JS key, JS val) throws JSExn { throw new JSExn("can't write to org.ibex.js.Reflection.Array's"); }
+ public JS get(JS key) throws JSExn { return wrap(arr[Script.toInt(key)]); }
}
// FIXME public static class Hash { }
// FIXME public Enumeration keys() throws JSExn { }
public JS get(JS key) throws JSExn {
- String k = toString(key);
+ String k = Script.toString(key);
try {
Field f = this.getClass().getField(k);
return wrap(f.get(this));
} catch (SecurityException nfe) { }
try {
- Method[] methods = this.getClass().getMethods();
+ java.lang.reflect.Method[] methods = this.getClass().getMethods();
for(int i=0; i<methods.length; i++) if (methods[i].getName().equals(k)) return METHOD;
} catch (SecurityException nfe) { }
return null;
throw new JSExn("put() not supported yet");
}
- public JS callMethod(JS method, JS a0, JS a1, JS a2, JS[] rest, int nargs) throws JSExn {
- String k = toString(method);
+ public JS call(JS method, JS[] args) throws JSExn {
+ String k = Script.toString(method);
try {
- Method[] methods = this.getClass().getMethods();
+ java.lang.reflect.Method[] methods = this.getClass().getMethods();
for(int j=0; j<methods.length; j++) {
- if (methods[j].getName().equals(k) && methods[j].getParameterTypes().length == nargs) {
- Object[] args = new Object[nargs];
- for(int i = 0; i<args.length; i++) {
- if (i==0) args[i] = a0;
- else if (i==1) args[i] = a1;
- else if (i==2) args[i] = a2;
- else args[i] = rest[i-3];
- }
- return wrap(methods[j].invoke(this, args));
+ if (methods[j].getName().equals(k) &&
+ methods[j].getParameterTypes().length == args.length) {
+ return wrap(methods[j].invoke(this, (Object[])args));
}
}
} catch (IllegalAccessException nfe) {