1 cananian 1.1.2.1 // MONITOREXIT.java, created Thu Sep 18  1:18:42 1998 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.IR.Quads;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.6 import harpoon.ClassFile.HCodeElement;
 7 cananian 1.1.2.1 import harpoon.Temp.Temp;
 8 cananian 1.1.2.1 import harpoon.Temp.TempMap;
 9 cananian 1.1.2.2 import harpoon.Util.Util;
10 cananian 1.1.2.2 
11 cananian 1.1.2.1 /**
12 cananian 1.1.2.1  * <code>MONITOREXIT</code> releases the monitor lock of a particular
13 cananian 1.1.2.1  * object.  Note that these java "monitors" are really a flavor of
14 cananian 1.1.2.1  * recursive lock; see the 
15 cananian 1.1.2.1  * <A HREF="http://www.cs.arizona.edu/sumatra/hallofshame/">Java
16 cananian 1.1.2.1  * hall of shame</A> for more details.  The <code>MONITOREXIT</code>
17 cananian 1.1.2.1  * quad works the same way as the java <code>monitorexit</code> bytecode.
18 cananian 1.1.2.1  * See the JVM spec for details.
19 cananian 1.1.2.1  * 
20 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
21 cananian 1.5      * @version $Id: MONITOREXIT.java,v 1.5 2002/04/11 04:00:34 cananian Exp $
22 cananian 1.1.2.1  */
23 cananian 1.1.2.1 public class MONITOREXIT extends Quad {
24 cananian 1.1.2.1     /** The object containing the monitor to be released. */
25 cananian 1.1.2.2     protected Temp lock;
26 cananian 1.1.2.1 
27 cananian 1.1.2.1     /** Creates a <code>MONITOREXIT</code>. Code after a
28 cananian 1.1.2.1      *  <code>MONITORENTER</code> referencing the same object 
29 cananian 1.1.2.2      *  and before this point is protected by the monitor.
30 cananian 1.1.2.2      * @param lock
31 cananian 1.1.2.2      *        the <code>Temp</code> referencing the object monitor to release.
32 cananian 1.1.2.2      */
33 cananian 1.1.2.4     public MONITOREXIT(QuadFactory qf, HCodeElement source, Temp lock) {
34 cananian 1.1.2.4         super(qf, source);
35 cananian 1.1.2.1         this.lock = lock;
36 cananian 1.3.2.1         assert lock!=null;
37 cananian 1.1.2.1     }
38 cananian 1.1.2.2     // ACCESSOR METHODS:
39 cananian 1.1.2.2     /** Returns the <code>Temp</code> specifying the object to be released. */
40 cananian 1.1.2.2     public Temp lock() { return lock; }
41 cananian 1.1.2.2 
42 cananian 1.1.2.1     /** Returns the Temp used by this Quad.
43 cananian 1.1.2.1      *  @return the <code>lock</code> field. */
44 cananian 1.1.2.1     public Temp[] use() { return new Temp[] { lock }; }
45 cananian 1.1.2.1 
46 cananian 1.1.2.3     public int kind() { return QuadKind.MONITOREXIT; }
47 cananian 1.1.2.3 
48 cananian 1.1.2.5     public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) {
49 cananian 1.1.2.5         return new MONITOREXIT(qqf, this, map(useMap, lock));
50 cananian 1.1.2.3     }
51 cananian 1.1.2.5     /** Rename all used variables in this Quad according to a mapping.
52 cananian 1.1.2.5      * @deprecated does not preserve immutability. */
53 cananian 1.1.2.3     void renameUses(TempMap tm) {
54 cananian 1.1.2.1         lock = tm.tempMap(lock);
55 cananian 1.1.2.1     }
56 cananian 1.1.2.1 
57 cananian 1.1.2.7     public void accept(QuadVisitor v) { v.visit(this); }
58 cananian 1.5         public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); }
59 cananian 1.1.2.1 
60 cananian 1.1.2.2     /** Returns a human-readable representation of this quad. */
61 cananian 1.1.2.1     public String toString() {
62 cananian 1.1.2.1         return "MONITOREXIT " + lock;
63 cananian 1.1.2.1     }
64 cananian 1.2     }