bugfix in url parsing for HTTP.java
[org.ibex.core.git] / src / org / ibex / js / Interpreter.java
index 92b29a4..14f0f19 100644 (file)
@@ -217,10 +217,22 @@ class Interpreter implements ByteCodes, Tokens {
                     throw je("tried to assign \"" + (val==null?"(null)":val.toString()) + "\" to the null key");
 
                 Trap t = null;
-                if (target instanceof Trap.TrapScope && key.equals("cascade")) {
-                    Trap.TrapScope ts = (Trap.TrapScope)target;
-                    t = ts.t.next;
-                    ts.cascadeHappened = true;
+                if (target instanceof JSScope && key.equals("cascade")) {
+                   Trap.TrapScope ts = null;
+                    JSScope p = (JSScope)target; // search the scope-path for the trap
+                   if (target instanceof Trap.TrapScope) {
+                       ts = (Trap.TrapScope)target;
+                   }
+                   else {
+                       while (ts == null && p.getParentScope() != null) {
+                           p = p.getParentScope();
+                           if (p instanceof Trap.TrapScope) {
+                               ts = (Trap.TrapScope)p;
+                           }
+                       }
+                   }
+                   t = ts.t.next;
+                   ts.cascadeHappened = true;
                     while (t != null && t.f.numFormalArgs == 0) t = t.next;
                     if (t == null) { target = ts.t.trapee; key = ts.t.name; }
 
@@ -235,21 +247,13 @@ class Interpreter implements ByteCodes, Tokens {
                     } else {
                         t = ((JS)target).getTrap(key);
                     }
-
                     while (t != null && t.f.numFormalArgs == 0) t = t.next; // find the first write trap
-                    if (t != null) {
-                        stack.push(new CallMarker(this));
-                        JSArray args = new JSArray();
-                        args.addElement(val);
-                        stack.push(args);
-                    }
                 }
                 if (t != null) {
-                    stack.pop();
                     stack.push(new CallMarker(this));
-                    stack.push(target);
                     JSArray args = new JSArray();
                     args.addElement(val);
+                    stack.push(args);
                     f = t.f;
                     scope = new Trap.TrapScope(f.parentScope, t, val);
                     pc = -1;
@@ -368,7 +372,8 @@ class Interpreter implements ByteCodes, Tokens {
             }
 
             case THROW:
-                throw new JSExn(stack.pop());
+                throw new JSExn(stack.pop(), stack, f, pc, scope);
+
                 /* FIXME
             case MAKE_GRAMMAR: {
                 final Grammar r = (Grammar)arg;
@@ -510,7 +515,6 @@ class Interpreter implements ByteCodes, Tokens {
             }
 
         } catch(JSExn e) {
-            if(f.op[pc] != FINALLY_DONE) e.addBacktrace(f.sourceName,f.line[pc]);
             while(stack.size() > 0) {
                 Object o = stack.pop();
                 if (o instanceof CatchMarker || o instanceof TryMarker) {
@@ -535,12 +539,6 @@ class Interpreter implements ByteCodes, Tokens {
                         pc = ((TryMarker)o).finallyLoc - 1;
                         continue OUTER;
                     }
-                } else if(o instanceof CallMarker) {
-                    CallMarker cm = (CallMarker) o;
-                    if(cm.f == null)
-                        e.addBacktrace("<java>",0); // This might not even be worth mentioning
-                    else
-                        e.addBacktrace(cm.f.sourceName,cm.f.line[cm.pc-1]);
                 }
             }
             throw e;
@@ -691,7 +689,7 @@ class Interpreter implements ByteCodes, Tokens {
     static Object getFromPrimitive(Object o, Object key) throws JSExn {
         boolean returnJS = false;
         if (o instanceof Boolean) {
-            throw new JSExn("cannot call methods on Booleans");
+            throw new JSExn("Booleans do not have properties");
         } else if (o instanceof Number) {
             if (key.equals("toPrecision") || key.equals("toExponential") || key.equals("toFixed"))
                 returnJS = true;