* linked list stack, with the most recently placed trap at the head
* of the list.
*/
-class Trap {
+final class Trap {
- JS trapee = null; ///< the box on which this trap was placed
- JS name = null; ///< the property that the trap was placed on
+ final JS target; ///< the box on which this trap was placed
+ final JS key; ///< the property that the trap was placed on
- JSFunction f = null; ///< the function for this trap
- Trap next = null; ///< the next trap down the trap stack
+ final JSFunction f; ///< the function for this trap
+ Trap next; ///< the next trap down the trap stack
Trap(JS b, JS n, JSFunction f, Trap nx) {
- trapee = b; name = n; this.f = f; this.next = nx;
+ target = b; key = n; this.f = f; this.next = nx;
}
-
- static final JSFunction putInvoker = new JSFunction("putInvoker", 0, null);
- static final JSFunction getInvoker = new JSFunction("getInvoker", 0, null);
-
- static {
- putInvoker.add(1, ByteCodes.PUT, null);
- putInvoker.add(2, Tokens.RETURN, null);
- getInvoker.add(1, ByteCodes.GET, null);
- getInvoker.add(2, Tokens.RETURN, null);
- }
-
- boolean readTrap() { return f.numFormalArgs == 0; }
- boolean writeTrap() { return f.numFormalArgs != 0; }
- void invoke(JS value) throws JSExn {
- Interpreter i = new Interpreter(putInvoker, false, null);
- i.stack.push(trapee);
- i.stack.push(name);
- i.stack.push(value);
- i.resume();
- }
-
- JS invoke() throws JSExn {
- Interpreter i = new Interpreter(getInvoker, false, null);
- i.stack.push(trapee);
- i.stack.push(name);
- return i.resume();
- }
+ boolean isReadTrap() { return f.numFormalArgs == 0; }
+ boolean isWriteTrap() { return f.numFormalArgs != 0; }
+ Trap readTrap() { Trap t = this; while(t!=null && t.isWriteTrap()) t = t.next; return t; }
+ Trap writeTrap() { Trap t = this; while(t!=null && t.isReadTrap()) t = t.next; return t; }
+ Trap nextReadTrap() { return next == null ? null : next.readTrap(); }
+ Trap nextWriteTrap() { return next == null ? null : next.writeTrap(); }
}