1 cananian 1.1.2.1 // RETURN.java, created Wed Aug  5 06:46:49 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>RETURN</code> objects indicate a method return, with an
13 cananian 1.1.2.1  * optional return value.
14 cananian 1.1.2.1  * 
15 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
16 cananian 1.3      * @version $Id: RETURN.java,v 1.3 2002/04/11 04:00:34 cananian Exp $
17 cananian 1.1.2.1  */
18 cananian 1.1.2.1 public class RETURN extends Quad {
19 cananian 1.1.2.1     /** Return value. <code>null</code> if there is no return value. */
20 cananian 1.1.2.2     protected Temp retval;
21 cananian 1.1.2.2 
22 cananian 1.1.2.2     /** Creates a <code>RETURN</code> representing a method return.
23 cananian 1.1.2.2      * @param retval
24 cananian 1.1.2.2      *        the <code>Temp</code> holding the return value for the
25 cananian 1.1.2.2      *        method.  The <code>retval</code> field should be 
26 cananian 1.1.2.2      *        <code>null</code> if the method does not return a value.
27 cananian 1.1.2.2      */
28 cananian 1.1.2.4     public RETURN(QuadFactory qf, HCodeElement source, Temp retval) {
29 cananian 1.1.2.4         super(qf, source, 1, 1 /* one successor, the footer node. */);
30 cananian 1.1.2.1         this.retval = retval;
31 cananian 1.1.2.2         // nothing to verify.
32 cananian 1.1.2.1     }
33 cananian 1.1.2.2     /** Returns the <code>Temp</code> which holds the method return value,
34 cananian 1.1.2.2      *  or returns <code>null</code> if the method returns no value. */
35 cananian 1.1.2.2     public Temp retval() { return retval; }
36 cananian 1.1.2.1 
37 cananian 1.1.2.1     /** Returns all the Temps used by this Quad. */
38 cananian 1.1.2.1     public Temp[] use() {
39 cananian 1.1.2.1         if (retval==null) return new Temp[0];
40 cananian 1.1.2.1         else return new Temp[] { retval }; 
41 cananian 1.1.2.1     }
42 cananian 1.1.2.1 
43 cananian 1.1.2.3     public int kind() { return QuadKind.RETURN; }
44 cananian 1.1.2.3 
45 cananian 1.1.2.5     public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) {
46 cananian 1.1.2.5         return new RETURN(qqf, this, map(useMap,retval));
47 cananian 1.1.2.3     }
48 cananian 1.1.2.5     /** Rename all used variables in this Quad according to a mapping.
49 cananian 1.1.2.5      * @deprecated does not preserve immutability. */
50 cananian 1.1.2.3     void renameUses(TempMap tm) {
51 cananian 1.1.2.1         if (retval!=null)
52 cananian 1.1.2.1             retval = tm.tempMap(retval);
53 cananian 1.1.2.1     }
54 cananian 1.1.2.5     /** Rename all defined variables in this Quad according to a mapping.
55 cananian 1.1.2.5      * @deprecated does not preserve immutability. */
56 cananian 1.1.2.3     void renameDefs(TempMap tm) {
57 cananian 1.1.2.1     }
58 cananian 1.1.2.1 
59 cananian 1.1.2.7     public void accept(QuadVisitor v) { v.visit(this); }
60 cananian 1.3         public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); }
61 cananian 1.1.2.1 
62 cananian 1.1.2.1     /** Returns a human-readable representation of this Quad. */
63 cananian 1.1.2.1     public String toString() {
64 cananian 1.1.2.1         if (retval==null) return "RETURN";
65 cananian 1.1.2.1         return "RETURN " + retval.toString();
66 cananian 1.1.2.1     }
67 cananian 1.2     }