e92bad7231c57b8b52a449fa9c878fd45b635c2e
[org.ibex.core.git] / src / org / xwt / js / Trap.java
1 // Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL]
2 package org.xwt.js;
3
4 import java.util.*;
5 import org.xwt.util.*;
6 import java.io.*;
7
8 /**
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
12  *  of the list.
13  */
14 class Trap {
15
16     JS trapee = null;          ///< the box on which this trap was placed
17     Object name = null;        ///< the property that the trap was placed on
18
19     JSFunction f = null;       ///< the function for this trap
20     Trap next = null;          ///< the next trap down the trap stack
21
22     Trap(JS b, String n, JSFunction f, Trap nx) { trapee = b; name = n; this.f = f; this.next = nx; }
23
24     private static final JSFunction putInvoker = new JSFunction("putInvoker", 0, null);
25     private static final JSFunction getInvoker = new JSFunction("getInvoker", 0, null);
26     static {
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);
31     }
32     
33     void invoke(Object key, Object value) throws JSExn {
34         Interpreter i = new Interpreter(putInvoker, false, null);
35         i.stack.push(trapee);
36         i.stack.push(key);
37         i.stack.push(value);
38         i.resume();
39     }
40
41     Object invoke(Object key) throws JSExn {
42         Interpreter i = new Interpreter(getInvoker, false, null);
43         i.stack.push(this);
44         i.stack.push(key);
45         i.resume();
46         return i.stack.pop();
47     }
48
49     // FIXME: review; is necessary?
50     static class TrapScope extends JSScope {
51         Trap t;
52         Object val = null;
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);
59         }
60     }
61 }
62