X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FTrap.java;h=2895d9f8873643e7eb739f090210163fe118fa5c;hb=6a96430e10e27fc1de5754cb5add705f929dd109;hp=f33f75a96610786fe83434a3350d9cfa603d6144;hpb=e072ecc212b652dd55fb932cd7ed715e65dcfd2b;p=org.ibex.core.git diff --git a/src/org/xwt/Trap.java b/src/org/xwt/Trap.java index f33f75a..2895d9f 100644 --- a/src/org/xwt/Trap.java +++ b/src/org/xwt/Trap.java @@ -96,20 +96,31 @@ public class Trap { private Trap() { } - public Object perform() throws JS.Exn { - if (f.getNumFormalArgs() > 0) return cascade(); - return f.call(new TrapArgs(this)); + public Object perform() { + try { + if (f.getNumFormalArgs() > 0) return cascade(); + JS.Thread.current().setTailCall(f, new TrapArgs(this)); + return null; + } catch (Exception e) { + Log.log(this, "Exception thrown from within trap: " + e); + return null; + } } - public void perform(Object val) throws JS.Exn { - if (f.getNumFormalArgs() == 0) cascade(val); - TrapArgs ta = new TrapArgs(this, val); - Object ret = f.call(ta); - if (ret != Boolean.FALSE && !ta.cascadeHappened) cascade(val); + public void perform(Object val) { + try { + if (f.getNumFormalArgs() == 0) cascade(val); + TrapArgs ta = new TrapArgs(this, val); + JS.Thread.current().setTailCall(f, ta); + // FIXME: re-add autocascades + //if (ret != Boolean.FALSE && !ta.cascadeHappened) cascade(val); + } catch (Exception e) { + Log.log(this, "Exception thrown from within trap: " + e); + } } public Object cascade() { - if (next != null) return next.perform(); + if (next != null) { next.perform(); return null; } return trapee.get(name, true); } @@ -135,6 +146,7 @@ public class Trap { if (key.equals("trapee")) return t.trapee; if (key.equals("trapname")) return t.name; if (key.equals("cascade")) return t.cascade(); + if (key.equals("callee")) return t.f; return super.get(key); } }