fixed heinous breakage, added backtrace support
[org.ibex.core.git] / src / org / ibex / js / Interpreter.java
index 92b29a4..ce83f69 100644 (file)
@@ -235,21 +235,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 +360,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 +503,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 +527,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 +677,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;