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 }