X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FTrap.java;fp=src%2Forg%2Fxwt%2FTrap.java;h=f982ffa195664d06bfca49e4cdd630d4a345110b;hb=214fe5c02d3f0fb9c3c61128a100e6a3cb01668e;hp=2f436c42d53f4f5d2fa12d32a9bf834f36549df7;hpb=605c83ebfebbf069a495dd9a26e509e30465aa08;p=org.ibex.core.git diff --git a/src/org/xwt/Trap.java b/src/org/xwt/Trap.java index 2f436c4..f982ffa 100644 --- a/src/org/xwt/Trap.java +++ b/src/org/xwt/Trap.java @@ -16,6 +16,19 @@ public class Trap { // Static Data ////////////////////////////////////////////////////////////// + private static JS.CompiledFunction cascadeHelper = null; + private static String cascadeHelperText = + "return function(q) { var ret = arguments.doTrap;" + + "if (ret != false && !arguments.didCascade) arguments.cascade = q; };"; + static { + try { + cascadeHelper = JS.parse("cascadeHelper", 1, new StringReader(cascadeHelperText)); + cascadeHelper = (JS.CompiledFunction)new JS.Thread(cascadeHelper).resume(); + } catch (Exception e) { + Log.log(Trap.class, e); + } + } + /** List of properties that cannot be trapped */ private static final Hash PROHIBITED = new Hash(120, 3); @@ -63,12 +76,7 @@ public class Trap { if (t.f == f) return; // actually place the trap - Trap t = new Trap(); - t.next = (Trap)trapee.get(name, Trap.class); - trapee.put(name, Trap.class, t); - t.trapee = trapee; - t.name = name; - t.f = f; + trapee.put2(name, Trap.class, new Trap(trapee, name.toString(), f, (Trap)trapee.get(name, Trap.class))); } @@ -80,66 +88,43 @@ public class Trap { */ static void delTrap(Box trapee, Object name, JS.CompiledFunction f) { Trap t = (Trap)trapee.get(name, Trap.class); - if (t.f == f) { - trapee.put(name, Trap.class, t.next); - return; - } + if (t.f == f) { trapee.put2(name, Trap.class, t.next); return; } for(; t.next != null; t = t.next) - if (t.next.f == f) { - t.next = t.next.next; - return; - } + if (t.next.f == f) { t.next = t.next.next; return; } Log.logJS("warning: tried to remove a trap that had not been placed"); } // Instance Methods ////////////////////////////////////////////////////////////////////////// - private Trap() { } + private Trap(Box b, String n, JS.CompiledFunction f, Trap nx) + { trapee = b; name = n; this.f = f; this.next = nx; } + + // Read Traps ////////////////////////////////////////////////////////////////////// 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; - } + if (f.getNumFormalArgs() > 0) return cascade(); + else return new JS.TailCall().set(f, new TrapArgs(this)); } - private static JS.CompiledFunction cascadeHelper = null; - private static String cascadeHelperText = - "return function(q) { var ret = arguments.doTrap;" + - "if (ret != false && !arguments.didCascade) arguments.cascade = q; };"; - static { - try { - cascadeHelper = JS.parse("cascadeHelper", 1, new StringReader(cascadeHelperText)); - cascadeHelper = (JS.CompiledFunction)new JS.Thread(cascadeHelper).resume(); - } catch (Exception e) { - Log.log(Trap.class, e); - } + public Object cascade() { + if (next != null) return next.perform(); + else return trapee.get(name, true); } - public void perform(Object val) { - try { - if (f.getNumFormalArgs() == 0) cascade(val); - else JS.Thread.current().setTailCall(cascadeHelper, new TrapArgs(this, val)); - } catch (Exception e) { - Log.log(this, "Exception thrown from within trap: " + e); - e.printStackTrace(); - } + // Write Traps ////////////////////////////////////////////////////////////////////// + + public void perform(Object val, JS.TailCall tail) { + if (f.getNumFormalArgs() == 0) cascade(val, tail); + else tail.set(cascadeHelper, new TrapArgs(this, val)); } - public Object cascade() { - if (next != null) { next.perform(); return null; } - return trapee.get(name, true); + public void cascade(Object val, JS.TailCall tail) { + if (next != null) next.perform(val, tail); + else trapee.put(name, val, tail, true); } - public void cascade(Object val) { - if (next != null) next.perform(val); - trapee.put(name, val, true); - } + // Args /////////////////////////////////////////////////////////////////////////// private static class TrapArgs extends JS.Array { private Trap t; @@ -147,16 +132,16 @@ public class Trap { 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")) { cascadeHappened = true; t.cascade(val); } - else super.put(key, val); + public void put(Object key, Object val, JS.TailCall tail) { + if (key.equals("cascade")) { cascadeHappened = true; t.cascade(val, tail); } + else super.put(key, val, (JS.TailCall)tail); } public Object get(Object key) { // common case if(!(key instanceof String)) return super.get(key); if (key.equals("trapee")) return t.trapee; - if (key.equals("doTrap")) { JS.Thread.current().setTailCall(t.f, this); return null; } + if (key.equals("doTrap")) return new JS.TailCall().set(t.f, this); if (key.equals("didCascade")) return cascadeHappened ? Boolean.TRUE : Boolean.FALSE; if (key.equals("trapname")) return t.name; if (key.equals("cascade")) return t.cascade();