--- /dev/null
+// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
+package org.ibex.js;
+
+/**
+ * This class encapsulates a single trap placed on a given node. The
+ * traps for a given property name on a given box are maintained as a
+ * linked list stack, with the most recently placed trap at the head
+ * of the list.
+ */
+class Trap {
+
+ JS trapee = null; ///< the box on which this trap was placed
+ Object name = null; ///< 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
+
+ Trap(JS b, String n, JSFunction f, Trap nx) {
+ trapee = b; name = n; this.f = f; this.next = nx;
+ }
+
+ private static final JSFunction putInvoker = new JSFunction("putInvoker", 0, null);
+ private 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);
+ }
+
+ void invoke(Object value) throws JSExn {
+ Interpreter i = new Interpreter(putInvoker, false, null);
+ i.stack.push(trapee);
+ i.stack.push(name);
+ i.stack.push(value);
+ i.resume();
+ }
+
+ Object invoke() throws JSExn {
+ Interpreter i = new Interpreter(getInvoker, false, null);
+ i.stack.push(trapee);
+ i.stack.push(name);
+ return i.resume();
+ }
+
+ // FIXME: review; is necessary?
+ static class TrapScope extends JSScope {
+ Trap t;
+ Object val = null;
+ boolean cascadeHappened = false;
+ public TrapScope(JSScope parent, Trap t, Object val) { super(parent); this.t = t; this.val = val; }
+ public Object get(Object key) throws JSExn {
+ if (key.equals("trapee")) return t.trapee;
+ if (key.equals("callee")) return t.f;
+ if (key.equals("trapname")) return t.name;
+ return super.get(key);
+ }
+ }
+}
+