for(int i=0; i<s.length(); i++) if (s.charAt(i) < '0' || s.charAt(i) > '9') return Integer.MIN_VALUE;
return Integer.parseInt(s);
}
- public Object get(Object key) {
+ public Object get(Object key) throws JS.Exn {
// FIXME: HACK!
if (key.equals("cascade")) return org.xwt.Trap.cascadeFunction;
+ if (key.equals("trapee")) return org.xwt.Trap.currentTrapee();
if (key.equals("length")) return new Long(vec.size());
int i = intVal(key);
if (i == Integer.MIN_VALUE) return super.get(key);
- return vec.elementAt(i);
+ try {
+ return vec.elementAt(i);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ throw new JS.Exn(e.getMessage());
+ }
}
public void put(Object key, Object val) {
if (key.equals("length")) vec.setSize(Parser.toNumber(val).intValue());
int i = intVal(key);
if (i == Integer.MIN_VALUE) super.put(key, val);
- else vec.setElementAt(val, i);
+ else {
+ if (i >= vec.size()) vec.setSize(i+1);
+ vec.setElementAt(val, i);
+ }
}
public Object[] keys() {
Object[] sup = super.keys();
}
public static class Script extends Function {
- Parser.Expr e = null;
- private Script(Parser.Expr e) { this.e = e; }
+ Vector e = null;
+ private Script(Vector e) { this.e = e; }
+ public String getSourceName() throws JS.Exn { return ((Parser.Expr)e.elementAt(0)).sourceName; }
public Object _call(JS.Array args) throws JS.Exn {
Scope rootScope = (Scope)args.elementAt(0);
+ Function saved = (Function)currentFunction.get(Thread.currentThread());
+ currentFunction.put(Thread.currentThread(), this);
try {
- e.eval(rootScope);
+ for(int i=0; i<e.size(); i++)
+ ((Parser.Expr)e.elementAt(i)).eval(rootScope);
} catch (Parser.ReturnException e) {
// ignore
} catch (Parser.ControlTransferException e) {
throw new JS.Exn("block threw a ControlTransferException: " + e);
+ } finally {
+ if (saved == null) currentFunction.remove(Thread.currentThread());
+ else currentFunction.put(Thread.currentThread(), saved);
}
return null;
}
public static Script parse(Reader r, String sourceName, int line) throws IOException {
Parser p = new Parser(r, sourceName, line);
- p.pushBackToken(Lexer.LC); // FIXME: hack
try {
- return new Script(p.parseBlock(true));
+ Vector exprs = new Vector();
+ while(true) {
+ Parser.Expr ret = p.parseBlock(false);
+ if (ret == null || (ret.code == Parser.LC && ret.left == null)) break;
+ exprs.addElement(ret);
+ }
+ return new Script(exprs);
} catch (Exception e) {
if (Log.on) Log.log(Parser.class, e);
return null;