mass rename and rebranding from xwt to ibex - fixed to use ixt files
[org.ibex.core.git] / src / org / ibex / js / Trap.java
diff --git a/src/org/ibex/js/Trap.java b/src/org/ibex/js/Trap.java
new file mode 100644 (file)
index 0000000..4b2f92a
--- /dev/null
@@ -0,0 +1,61 @@
+// 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);
+        }
+    }
+}
+