new js api
[org.ibex.core.git] / src / org / ibex / js / Trap.java
1 // Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
2 package org.ibex.js;
3
4 /**
5  *  This class encapsulates a single trap placed on a given node. The
6  *  traps for a given property name on a given box are maintained as a
7  *  linked list stack, with the most recently placed trap at the head
8  *  of the list.
9  */
10 class Trap {
11
12     JS trapee = null;          ///< the box on which this trap was placed
13     JS name = null;        ///< the property that the trap was placed on
14
15     JSFunction f = null;       ///< the function for this trap
16     Trap next = null;          ///< the next trap down the trap stack
17
18     Trap(JS b, JS n, JSFunction f, Trap nx) {
19         trapee = b; name = n; this.f = f; this.next = nx;
20     }
21
22     static final JSFunction putInvoker = new JSFunction("putInvoker", 0, null);
23     static final JSFunction getInvoker = new JSFunction("getInvoker", 0, null);
24
25     static {
26         putInvoker.add(1, ByteCodes.PUT, null);
27         putInvoker.add(2, Tokens.RETURN, null);
28         getInvoker.add(1, ByteCodes.GET, null);
29         getInvoker.add(2, Tokens.RETURN, null);
30     }
31     
32     boolean readTrap() { return f.numFormalArgs == 0; }
33     boolean writeTrap() { return f.numFormalArgs != 0; }
34     
35     void invoke(JS value) throws JSExn {
36         Interpreter i = new Interpreter(putInvoker, false, null);
37         i.stack.push(trapee);
38         i.stack.push(name);
39         i.stack.push(value);
40         i.resume();
41     }
42
43     JS invoke() throws JSExn {
44         Interpreter i = new Interpreter(getInvoker, false, null);
45         i.stack.push(trapee);
46         i.stack.push(name);
47         return i.resume();
48     }
49
50     // FIXME: review; is necessary?
51     /*static class TrapScope extends JSScope {
52         Trap t;
53         Object val = null;
54         boolean cascadeHappened = false;
55         public TrapScope(JSScope parent, Trap t, Object val) { super(parent); this.t = t; this.val = val; }
56         public Object get(Object key) throws JSExn {
57             if (key.equals("trapee")) return t.trapee;
58             if (key.equals("callee")) return t.f;
59             if (key.equals("trapname")) return t.name;
60             return super.get(key);
61         }
62     }*/
63 }
64