X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FTrap.java;h=2895d9f8873643e7eb739f090210163fe118fa5c;hb=6a96430e10e27fc1de5754cb5add705f929dd109;hp=df51b5317974ab988ce053fe6400d28523c30467;hpb=16ea48d834626fb9815da2f7632c3633838fb790;p=org.ibex.core.git diff --git a/src/org/xwt/Trap.java b/src/org/xwt/Trap.java index df51b53..2895d9f 100644 --- a/src/org/xwt/Trap.java +++ b/src/org/xwt/Trap.java @@ -96,29 +96,31 @@ public class Trap { private Trap() { } - public Object perform() throws JS.Exn { + public Object perform() { try { if (f.getNumFormalArgs() > 0) return cascade(); - return f.call(new TrapArgs(this)); + 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 { + public void perform(Object val) { try { 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); + 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); }