import java.util.*;
import org.xwt.js.*;
import org.xwt.util.*;
+import java.io.*;
/**
* This class encapsulates a single trap placed on a given node. The
return null;
}
}
-
+
+ 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 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);
+ else JS.Thread.current().setTailCall(cascadeHelper, new TrapArgs(this, val));
} catch (Exception e) {
Log.log(this, "Exception thrown from within trap: " + e);
+ e.printStackTrace();
}
}
// 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("didCascade")) return cascadeHappened ? Boolean.TRUE : Boolean.FALSE;
if (key.equals("trapname")) return t.name;
if (key.equals("cascade")) return t.cascade();
if (key.equals("callee")) return t.f;