X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Forg%2Fibex%2Fjs%2FJSExn.java;h=b39d6c8a8517f872efdc609cfb122a6b0f7cd7b8;hb=db9fd9570a6e8302a34e6fc32d04d58b59e39a99;hp=8d1a758ee1c6aa503f3e3e7e7f29cc2014fd8a0a;hpb=3591b88b94a6bb378af3d4abe6eb5233ce583104;p=org.ibex.core.git diff --git a/src/org/ibex/js/JSExn.java b/src/org/ibex/js/JSExn.java index 8d1a758..b39d6c8 100644 --- a/src/org/ibex/js/JSExn.java +++ b/src/org/ibex/js/JSExn.java @@ -2,22 +2,46 @@ package org.ibex.js; 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; } + 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 + "\""); + } + } + } + public void printStackTrace() { printStackTrace(System.err); } + public void printStackTrace(PrintWriter pw) { + for(int i=0; i