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 }