}
public Object eval(final JS.Scope s, Vec t) throws ControlTransferException {
- for(int i=0; i<size; i++) switch(op[i]) {
+
+ for(int i=0; i<size; i++) {
+ switch(op[i]) {
case LABEL: break;
case LITERAL: t.push(arg[i]); break;
case OBJECT: t.push(new JS.Obj()); break;
Object key = t.pop();
JS target = (JS)t.peek();
if (target == null)
- throw new EvaluatorException(line, sourceName, "tried to put a value to the " + key + " property on the null value");
+ throw new JS.Exn(sourceName + ":" + line + ": tried to put a value to the " + key +
+ " property on the null value");
target.put(key, val);
t.push(val);
break;
arguments.setSize(numArgs);
for(int j=numArgs - 1; j >= 0; j--) arguments.setElementAt(t.pop(), j);
JS.Function f = (JS.Function)t.pop();
- if (f == null) throw new JS.Exn(new EvaluatorException(line, sourceName, "attempted to call null"));
+ if (f == null) throw new JS.Exn(sourceName + ":" + line + ": attempted to call null");
t.push(f.call(arguments));
break;
}
default: throw new Error("unknown opcode " + op[i]);
} }
}
- System.out.println("returning");
+ }
if (t.size() != 1) throw new Error("eval() terminated with " + t.size() + " elements on the stack; one expected");
return t.pop();
}
public Object doGet(final Object o, final Object v) {
if (o == null)
- throw new EvaluatorException(line, sourceName, "tried to get property \"" + v + "\" from the null value");
+ throw new JS.Exn(sourceName + ":" + line + ": tried to get property \"" + v + "\" from the null value");
if (o instanceof String) {
if (v.equals("length")) return new Integer(((String)o).length());
- else if (v.equals("substring")) return new JS.Function() {
+ else if (v.equals("substring")) return new JS.Function(-1, "java", null, null) {
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(),
else throw new Error("String.substring() can only take one or two arguments");
}
};
- else if (v.equals("toLowerCase")) return new JS.Function() {
+ else if (v.equals("toLowerCase")) return new JS.Function(-1, "java", null, null) {
public Object _call(JS.Array args) {
return ((String)o).toLowerCase();
} };
- else if (v.equals("toUpperCase")) return new JS.Function() {
+ else if (v.equals("toUpperCase")) return new JS.Function(-1, "java", null, null) {
public Object _call(JS.Array args) {
return ((String)o).toString().toUpperCase();
} };
- else if (v.equals("charAt")) return new JS.Function() {
+ else if (v.equals("charAt")) return new JS.Function(-1, "java", null, null) {
public Object _call(JS.Array args) {
return ((String)o).charAt(JS.toNumber(args.elementAt(0)).intValue()) + "";
} };
- else if (v.equals("lastIndexOf")) return new JS.Function() {
+ else if (v.equals("lastIndexOf")) return new JS.Function(-1, "java", null, null) {
public Object _call(JS.Array args) {
if (args.length() != 1) return null;
return new Integer(((String)o).lastIndexOf(args.elementAt(0).toString()));
} };
- else if (v.equals("indexOf")) return new JS.Function() {
+ else if (v.equals("indexOf")) return new JS.Function(-1, "java", null, null) {
public Object _call(JS.Array args) {
if (args.length() != 1) return null;
return new Integer(((String)o).indexOf(args.elementAt(0).toString()));