2003/05/26 10:38:33
[org.ibex.core.git] / src / org / xwt / js / JS.java
index 7c2cc19..f2946ea 100644 (file)
@@ -72,19 +72,27 @@ public abstract class JS {
            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();
@@ -108,24 +116,36 @@ public abstract class JS {
     }
 
     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;