// FIXME: could use some cleaning up
/** a JavaScript function, compiled into bytecode */
-class CompiledFunctionImpl extends JS.Callable implements ByteCodes, Tokens {
+class CompiledFunctionImpl extends JSCallable implements ByteCodes, Tokens {
// Fields and Accessors ///////////////////////////////////////////////
}
Object ret = null;
if (o == null) throw je("tried to get property \"" + v + "\" from the null value");
- if (v == null) throw je("tried to get the null key from " + v);
+ if (v == null) throw je("tried to get the null key from " + o);
if (o instanceof String) {
ret = getFromString((String)o, v);
} else if (o instanceof Boolean) {
boolean ret;
if (l == null) { Object tmp = r; r = l; l = tmp; }
if (l == null && r == null) ret = true;
+ else if (r == null) ret = false; // l != null, so its false
else if (l instanceof Boolean) ret = new Boolean(JS.toBoolean(r)).equals(l);
else if (l instanceof Number) ret = JS.toNumber(r).doubleValue() == JS.toNumber(l).doubleValue();
else if (l instanceof String) ret = r != null && l.equals(r.toString());
// Helpers for Number, String, and Boolean ////////////////////////////////////////
- private Object getFromString(final String o, final Object v) {
+ private static Object getFromString(final String o, final Object v) {
if (v.equals("length")) return new Integer(((String)o).length());
else if (v.equals("substring")) return new JS.Callable() {
public Object call(JS.Array args) {
if (args.length() == 1) return ((String)o).substring(JS.toNumber(args.elementAt(0)).intValue());
else if (args.length() == 2) return ((String)o).substring(JS.toNumber(args.elementAt(0)).intValue(),
JS.toNumber(args.elementAt(1)).intValue());
- else throw je("String.substring() can only take one or two arguments");
+ else throw new JS.Exn("String.substring() can only take one or two arguments");
}
};
else if (v.equals("toLowerCase")) return new JS.Callable() {
if (args.length() != 1) return null;
return new Integer(((String)o).indexOf(args.elementAt(0).toString()));
} };
- throw je("Not Implemented: propery " + v + " on String objects");
+ else if(v.equals("match")) return new JS.Callable() {
+ public Object call(JS.Array args) {
+ return Regexp.stringMatch(o,args);
+ } };
+ else if(v.equals("search")) return new JS.Callable() {
+ public Object call(JS.Array args) {
+ return Regexp.stringSearch(o,args);
+ } };
+ else if(v.equals("replace")) return new JS.Callable() {
+ public Object call(JS.Array args) {
+ return Regexp.stringReplace(o,args);
+ } };
+ else if(v.equals("split")) return new JS.Callable() {
+ public Object call(JS.Array args) {
+ return Regexp.stringSplit(o,args);
+ } };
+
+
+ throw new JS.Exn("Not Implemented: propery " + v + " on String objects");
}
}
}
+
+/** this class exists solely to work around a GCJ bug */
+abstract class JSCallable extends JS.Callable {
+ public abstract Object call(JS.Array args) throws JS.Exn;
+}