2004/01/13 10:27:47
[org.ibex.core.git] / src / org / xwt / js / Interpreter.java
index 700462a..359b844 100644 (file)
@@ -44,7 +44,17 @@ class Interpreter implements ByteCodes, Tokens {
         }
     }
 
-    private static JSExn je(String s) { return new JSExn(JS.getSourceName() + ":" + JS.getLine() + " " + s); }
+    static int getLine() {
+        Interpreter c = Interpreter.current();
+        return c == null || c.f == null || c.pc < 0 || c.pc >= c.f.size ? -1 : c.f.line[c.pc];
+    }
+
+    static String getSourceName() {
+        Interpreter c = Interpreter.current();
+        return c == null || c.f == null ? null : c.f.sourceName;
+    } 
+
+    private static JSExn je(String s) { return new JSExn(getSourceName() + ":" + getLine() + " " + s); }
 
     // FIXME: double check the trap logic
     private Object run() throws JSExn {
@@ -87,17 +97,17 @@ class Interpreter implements ByteCodes, Tokens {
             case ASSERT: if (!JS.toBoolean(stack.pop())) throw je("xwt.assertion.failed" /*FEATURE: line number*/); break;
             case BITNOT: stack.push(JS.N(~JS.toLong(stack.pop()))); break;
             case BANG: stack.push(JS.B(!JS.toBoolean(stack.pop()))); break;
-            case NEWFUNCTION: stack.push(((JSFunction)arg).cloneWithNewParentScope(scope)); break;
+            case NEWFUNCTION: stack.push(((JSFunction)arg)._cloneWithNewParentScope(scope)); break;
             case LABEL: break;
 
             case TYPEOF: {
                 Object o = stack.pop();
                 if (o == null) stack.push(null);
-                else if (o instanceof JS) stack.push(((JS)o).typeName());
+                else if (o instanceof JS) stack.push("object");
                 else if (o instanceof String) stack.push("string");
                 else if (o instanceof Number) stack.push("number");
                 else if (o instanceof Boolean) stack.push("boolean");
-                else stack.push("unknown");
+                else throw new Error("this should not happen");
                 break;
             }
 
@@ -139,7 +149,7 @@ class Interpreter implements ByteCodes, Tokens {
                     }
                 }
                 throw new Error("CONTINUE/BREAK invoked but couldn't find LoopMarker at " +
-                                JS.getSourceName() + ":" + JS.getLine());
+                                getSourceName() + ":" + getLine());
 
             case TRY: {
                 int[] jmps = (int[]) arg;