renamed Script to JSU
[org.ibex.js.git] / src / org / ibex / js / JSExn.java
index 1fda3c7..af72ce4 100644 (file)
@@ -1,53 +1,55 @@
-// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] 
+// Copyright 2000-2005 the Contributors, as shown in the revision logs.
+// Licensed under the Apache Public Source License 2.0 ("the License").
+// You may not use this file except in compliance with the License.
+
 package org.ibex.js; 
 
-import org.ibex.util.*; 
+import org.ibex.util.*;
 import java.io.*;
 
 /** An exception which can be thrown and caught by JavaScript code */
 public class JSExn extends Exception { 
-    private Vec backtrace = new Vec();
-    private Object js = null; 
-    public JSExn(Object js) {
-        this.js = js;
-        if (Interpreter.current() != null)
-            fill(Interpreter.current().stack, Interpreter.current().f, Interpreter.current().pc, Interpreter.current().scope);
-    }
-    public JSExn(Object js, Vec stack, JSFunction f, int pc, JSScope scope) { this.js = js; fill(stack, f, pc, scope); }
-    private void fill(Vec stack, JSFunction f, int pc, JSScope scope) {
-        addBacktrace(f.sourceName + ":" + f.line[pc]);
-        if (scope != null && scope instanceof Trap.TrapScope)
-            addBacktrace("trap on property \"" + ((Trap.TrapScope)scope).t.name + "\"");
-        for(int i=stack.size()-1; i>=0; i--) {
-            Object element = stack.elementAt(i);
-            if (element instanceof Interpreter.CallMarker) {
-                Interpreter.CallMarker cm = (Interpreter.CallMarker)element;
-                if (cm.f != null)
-                    addBacktrace(cm.f.sourceName + ":" + cm.f.line[cm.pc-1]);
-                if (cm.scope != null && cm.scope instanceof Trap.TrapScope)
-                    addBacktrace("trap on property \"" + ((Trap.TrapScope)cm.scope).t.name + "\"");
-            }
-        }
+    private Basket.List backtrace = new Basket.Array();
+    private JS js; 
+    public JSExn(String s) { this(JSU.S(s)); }
+    public JSExn(JS js) { this(js,null); }
+    public JSExn(JS js, Interpreter cx) { this.js = js; fill(cx); }
+    
+    private void fill(Interpreter cx) {
+        if(cx == null) cx = Interpreter.current();
+        if(cx == null) return;
+        addBacktrace(cx.f.sourceName + ":" + cx.f.line[cx.pc]);
+        cx.stack.backtrace(this);
     }
     public void printStackTrace() { printStackTrace(System.err); }
     public void printStackTrace(PrintWriter pw) {
-        for(int i=0; i<backtrace.size(); i++) pw.println("    at " + (String) backtrace.elementAt(i));
+        for(int i=0; i<backtrace.size(); i++) pw.println("    at " + (String) backtrace.get(i));
         super.printStackTrace(pw);
     }
     public void printStackTrace(PrintStream ps) {
-        for(int i=0; i<backtrace.size(); i++) ps.println("    at " + (String) backtrace.elementAt(i));
+        for(int i=0; i<backtrace.size(); i++) ps.println("    at " + (String) backtrace.get(i));
         super.printStackTrace(ps);
     }
-    public String toString() { return "JSExn: " + js; }
+    public String toString() { return "JSExn: " + JSU.str(js); }
     public String getMessage() { return toString(); }
-    public Object getObject() { return js; } 
-    public void addBacktrace(String line) { backtrace.addElement(line); }
-
-
+    public JS getObject() { return js; } 
+    
+    void addBacktrace(String line) { backtrace.add(line); }
+    
+    public static class Wrapper extends RuntimeException {
+        public final JSExn e;
+        public Wrapper(JSExn e) { this.e = e; }
+        public JSExn unwrap() {
+            e.addBacktrace("[foreign code]");
+            e.fill(null);
+            return e;
+        }
+    }
+    
     public static class IO extends JSExn {
         public IO(java.io.IOException ioe) {
             super("ibex.io: " + ioe.toString());
-            JS.warn(ioe);
+            JSU.warn(ioe);
         }
     }
 }