- boolean save_putCascadeHappened = tc.putCascadeHappened;
- tc.putCascadeHappened = false;
-
- // invoke the trap function
- try {
- if (!isreadtrap && args.length() == 0) return cascadeFunction.call(args);
-
- if (f == null) {
- if (Log.verbose) Log.log(this, "debug: reclaimed a dangling trap on property " + name);
- Object ret = cascadeFunction.call(args);
- delete();
- return ret;
- }
-
- Object ret = f.call(args);
-
- // autocascade if required
- if (args.length() > 0 && !isreadtrap && !tc.putCascadeHappened) cascadeFunction.call(args);
-
- return ret;
-
- } catch (JS.Exn e) {
- if (Log.on) Log.log(this, e);
-
- } finally {
- // restore the thread-locals
- tc.putCascadeHappened = save_putCascadeHappened;
- tc.currentTrap = save_currentTrap;
- tc.trapDepth--;
- }
- return null;
+ public Object perform() throws JS.Exn {
+ if (f.getNumFormalArgs() > 0) return cascade();
+ return f.call(new TrapArgs(this));