1 // Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL]
9 * This class encapsulates a single trap placed on a given node. The
10 * traps for a given property name on a given box are maintained as a
11 * linked list stack, with the most recently placed trap at the head
16 JS trapee = null; ///< the box on which this trap was placed
17 Object name = null; ///< the property that the trap was placed on
19 JSFunction f = null; ///< the function for this trap
20 Trap next = null; ///< the next trap down the trap stack
22 Trap(JS b, String n, JSFunction f, Trap nx) { trapee = b; name = n; this.f = f; this.next = nx; }
24 private static final JSFunction putInvoker = new JSFunction("putInvoker", 0, null);
25 private static final JSFunction getInvoker = new JSFunction("getInvoker", 0, null);
27 putInvoker.add(-1, ByteCodes.PUT, null);
28 putInvoker.add(-1, Tokens.RETURN, null);
29 getInvoker.add(-1, ByteCodes.GET, null);
30 putInvoker.add(-1, Tokens.RETURN, null);
33 void invoke(Object key, Object value) throws JSExn {
34 Interpreter i = new Interpreter(putInvoker, false, null);
41 Object invoke(Object key) throws JSExn {
42 Interpreter i = new Interpreter(getInvoker, false, null);
49 // FIXME: review; is necessary?
50 static class TrapScope extends JSScope {
53 boolean cascadeHappened = false;
54 public TrapScope(JSScope parent, Trap t, Object val) { super(parent); this.t = t; this.val = val; }
55 public Object get(Object key) throws JSExn {
56 if (key.equals("trapee")) return t.trapee;
57 if (key.equals("trapname")) return t.name;
58 return super.get(key);