/** An exception which can be thrown and caught by JavaScript code */
public class JSExn extends Exception {
private Vec backtrace = new Vec();
- private JS js = null;
+ private JS js;
public JSExn(String s) { this(JS.S(s)); }
- public JSExn(JS js) {
+ public JSExn(JS js) { this(js,Interpreter.current()); }
+ public JSExn(JS js, Interpreter cx) {
this.js = js;
- if (Interpreter.current() != null)
- fill(Interpreter.current().stack, Interpreter.current().f, Interpreter.current().pc, Interpreter.current().scope);
+ if(cx != null) fill(cx);
}
- public JSExn(JS js, Interpreter.Stack stack, JSFunction f, int pc, JSScope scope) { this.js = js; fill(stack, f, pc, scope); }
- private void fill(Interpreter.Stack stack, JSFunction f, int pc, JSScope scope) {
- addBacktrace(f.sourceName + ":" + f.line[pc]);
- for(int i=stack.size()-1; i>=0; i--) {
- JS element = stack.elementAt(i);
- if (element instanceof Interpreter.CallMarker) {
- Interpreter.CallMarker cm = (Interpreter.CallMarker)element;
- if(cm.f == null) break;
- String s = cm.f.sourceName + ":" + cm.f.line[cm.pc-1];
- if(cm instanceof Interpreter.TrapMarker)
- s += " (trap on " + JS.debugToString(((Interpreter.TrapMarker)cm).key) + ")";
- addBacktrace(s);
- }
- }
+ private void fill(Interpreter cx) {
+ addBacktrace(cx.f.sourceName + ":" + cx.f.line[cx.pc]);
+ cx.stack.backtrace(this);
}
public void printStackTrace() { printStackTrace(System.err); }
public void printStackTrace(PrintWriter pw) {
public String toString() { return "JSExn: " + JS.debugToString(js); }
public String getMessage() { return toString(); }
public JS getObject() { return js; }
- public void addBacktrace(String line) { backtrace.addElement(line); }
-
-
+
+ void addBacktrace(String line) { backtrace.addElement(line); }
+
public static class IO extends JSExn {
public IO(java.io.IOException ioe) {
super("ibex.io: " + ioe.toString());