X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FTrap.java;h=2895d9f8873643e7eb739f090210163fe118fa5c;hb=6a96430e10e27fc1de5754cb5add705f929dd109;hp=c6c6a47bd166b783a8b110c2dd520b877d4275e3;hpb=a81a151e639664cb340cf3726f9e8b9c77d125fb;p=org.ibex.core.git diff --git a/src/org/xwt/Trap.java b/src/org/xwt/Trap.java index c6c6a47..2895d9f 100644 --- a/src/org/xwt/Trap.java +++ b/src/org/xwt/Trap.java @@ -19,16 +19,14 @@ public class Trap { private static final Hash PROHIBITED = new Hash(120, 3); static { - // FIXME: review String[] p = new String[] { - "sizetoimage", "shrink", "hshrink", "vshrink", "x", "y", - "width", "height", "flex", "hflex", "vflex", "cols", + "shrink", "hshrink", "vshrink", "x", "y", + "width", "height", "flex", "colspan", "rowspan", "cols", "rows", "align", "invisible", "absolute", "globalx", "globaly", "minwidth", "minheight", "height", "width", "maxwidth", "maxheight", "numchildren", "hpad", "vpad", - "doublebuffered", "cursor", "mousex", "mousey", "xwt", - "static", "mouseinside", "root", "thisbox", "indexof", - "path" + "buffered", "cursor", "mousex", "mousey", + "mouseinside", "thisbox", "indexof", "path", "font", "fontsize" }; for(int i=0; i 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); - f.call(new TrapArgs(this, 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); } @@ -120,11 +131,12 @@ public class Trap { private static class TrapArgs extends JS.Array { private Trap t; + public boolean cascadeHappened = false; public TrapArgs(Trap t) { this.t = t; } public TrapArgs(Trap t, Object value) { this.t = t; addElement(value); } public void put(Object key, Object val) { - if (key.equals("cascade")) t.cascade(val); + if (key.equals("cascade")) { cascadeHappened = true; t.cascade(val); } else super.put(key, val); } @@ -134,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); } }