From 5f24fa01863f5f21f8ce5351f22b59cce07aa4e8 Mon Sep 17 00:00:00 2001 From: brian Date: Fri, 30 Jan 2004 07:02:45 +0000 Subject: [PATCH] 2003/07/05 02:38:15 darcs-hash:20040130070245-aa32f-51a842f76a0651ad63181a9626d821eaa7ad5989.gz --- src/org/xwt/Box.java | 5 ++ src/org/xwt/MessageQueue.java | 3 +- src/org/xwt/Trap.java | 112 ++++++++++++------------------ src/org/xwt/js/ArrayImpl.java | 6 +- src/org/xwt/js/CompiledFunctionImpl.java | 18 ++--- src/org/xwt/js/JS.java | 2 + src/org/xwt/js/Regexp.java | 2 + 7 files changed, 62 insertions(+), 86 deletions(-) diff --git a/src/org/xwt/Box.java b/src/org/xwt/Box.java index 04bc0cc..1f6cb0c 100644 --- a/src/org/xwt/Box.java +++ b/src/org/xwt/Box.java @@ -1503,6 +1503,11 @@ public final class Box extends JS.Scope { return this; } + // This is the name returned by typeof() by JS + public String typeName() { + return "box"; + } + } diff --git a/src/org/xwt/MessageQueue.java b/src/org/xwt/MessageQueue.java index 82934cf..ffbe064 100644 --- a/src/org/xwt/MessageQueue.java +++ b/src/org/xwt/MessageQueue.java @@ -87,7 +87,8 @@ public class MessageQueue extends Thread { if (Log.on) Log.log(this, "caught throwable in MessageQueue.run(); this should never happen"); if (Log.on) Log.log(this, " currentlyPerforming == " + currentlyPerforming); if (Log.on) Log.log(this, " working == " + working); - if (Log.on) Log.log(this, " lastfunc == " + lastfunc); + // FIXME - this currently calls compiledfunction.toString which gives more info than we need + // if (Log.on) Log.log(this, " lastfunc == " + lastfunc.getDescription()); if (Log.on) Log.log(this, " lastmessage == " + lastmessage); if (Log.on) Log.log(this, t); if (Log.on) Log.log(this, "resuming MessageQueue loop"); diff --git a/src/org/xwt/Trap.java b/src/org/xwt/Trap.java index e3b6c19..7966047 100644 --- a/src/org/xwt/Trap.java +++ b/src/org/xwt/Trap.java @@ -15,22 +15,6 @@ public class Trap { // Static Data ////////////////////////////////////////////////////////////// - /** the arguments.cascade() function */ - public static final JS.Callable cascadeFunction = new JS.Callable() { - public Object call(JS.Array args) { - Trap currentTrap = TrapContext.get().currentTrap; - if (args.length() != 0) TrapContext.get().putCascadeHappened = true; - Trap t = currentTrap.next; - // if we've hit the end of the trap stack, just do a put(,,,true) - if (t == null) { - if (args.length() == 0) return currentTrap.trapee.get(currentTrap.name, true); - currentTrap.trapee.put(currentTrap.name, args.elementAt(0), true); - return null; - } - return t.perform(args); - } - }; - /** a vector of weak references to all instances of Trap; used for retheming */ private static Hashtable allTraps = new Hashtable(1000); @@ -134,44 +118,22 @@ public class Trap { return null; } - /** called by Rhino's arguments.trapee hack */ - public static Object currentTrapee() { - Trap current = TrapContext.get().currentTrap; - if (current == null) return null; - else if (current.rp != null) return current.rp; - else return current.trapee; - } - - /** called by Rhino's arguments.trapname hack */ - public static String currentTrapname() { - Trap current = TrapContext.get().currentTrap; - if (current == null) return null; - else return current.name; - } - - // Instance Methods ////////////////////////////////////////////////////////////////////////// private Trap() { allTraps.put(myWeak, dummy); } /** perform this trap -- arg.length == 0 if this is a get; otherwise it contains a single element to be put */ - public Object perform(JS.Array args) throws JS.Exn { - TrapContext tc = TrapContext.get(); - - // save both thread-locals on the stack and update their values - Trap save_currentTrap = tc.currentTrap; - tc.currentTrap = this; - - boolean save_putCascadeHappened = tc.putCascadeHappened; - tc.putCascadeHappened = false; + public Object perform(JS.Array jsArrayArgs) throws JS.Exn { + // TrapContext tc = TrapContext.get(); + TrapArgs args = new TrapArgs(this,jsArrayArgs); // invoke the trap function try { - if (!isreadtrap && args.length() == 0) return cascadeFunction.call(args); + if (!isreadtrap && args.length() == 0) return cascade(args); if (f == null) { if (Log.verbose) Log.log(this, "debug: reclaimed a dangling trap on property " + name); - Object ret = cascadeFunction.call(args); + Object ret = cascade(args); delete(); return ret; } @@ -179,16 +141,23 @@ public class Trap { Object ret = f.call(args); // autocascade if required - if (args.length() > 0 && !isreadtrap && !tc.putCascadeHappened) cascadeFunction.call(args); + if(args.length() > 0 && !isreadtrap && !args.cascadeHappened) cascade(args); return ret; } finally { - // restore the thread-locals - tc.putCascadeHappened = save_putCascadeHappened; - tc.currentTrap = save_currentTrap; - tc.trapDepth--; + + } + } + + public Object cascade(JS.Array args) { + // if we've hit the end of the trap stack, just do a put(,,,true) + if (next == null) { + if (args.length() == 0) return trapee.get(name, true); + trapee.put(name, args.elementAt(0), true); + return null; } + return next.perform(args); } /** removes this trap */ @@ -203,28 +172,33 @@ public class Trap { trapee.surface.keywatchers.removeElement(trapee); allTraps.remove(myWeak); } - - /** per-thread storage for Traps */ - private static class TrapContext { - - private static Hash trapContextByThread = new Hash(); - private TrapContext() { } - - private boolean putCascadeHappened = false; - private Trap currentTrap = null; - private int trapDepth = 0; - - /** returns the TrapContext for the current thread */ - static TrapContext get() { - TrapContext ret = (TrapContext)trapContextByThread.get(java.lang.Thread.currentThread()); - if (ret == null) { - ret = new TrapContext(); - trapContextByThread.put(Thread.currentThread(), ret); - } - return ret; + + private static class TrapArgs extends JS.Array { + public boolean cascadeHappened; + private Trap t; + public TrapArgs(Trap t,JS.Array args) { + int size = args.length(); + setSize(size); + for(int i=0;i