1 cananian 1.1.2.9 // RETURN.java, created Thu Feb 18 16:59:53 1999 by duncan 2 cananian 1.1.2.16 // Copyright (C) 1998 Duncan Bryce <duncan@lcs.mit.edu> 3 cananian 1.1.2.8 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 duncan 1.1.2.1 package harpoon.IR.Tree; 5 duncan 1.1.2.1 6 duncan 1.1.2.1 import harpoon.ClassFile.HCodeElement; 7 cananian 1.1.2.14 import harpoon.Temp.TempMap; 8 pnkfelix 1.1.2.6 import harpoon.Util.Util; 9 duncan 1.1.2.1 10 duncan 1.1.2.1 /** 11 duncan 1.1.2.1 * <code>RETURN</code> objects are used to represent a return from 12 duncan 1.1.2.1 * a method body. 13 duncan 1.1.2.1 * 14 cananian 1.1.2.16 * @author Duncan Bryce <duncan@lcs.mit.edu>, based on 15 duncan 1.1.2.1 * <i>Modern Compiler Implementation in Java</i> by Andrew Appel. 16 cananian 1.4 * @version $Id: RETURN.java,v 1.4 2002/04/10 03:05:45 cananian Exp $ 17 duncan 1.1.2.1 */ 18 cananian 1.1.2.4 public class RETURN extends Stm implements Typed { 19 duncan 1.1.2.3 /** Constructor. 20 cananian 1.1.2.13 * @param retval the value to return. Never null. 21 duncan 1.1.2.3 */ 22 duncan 1.1.2.3 public RETURN(TreeFactory tf, HCodeElement source, 23 duncan 1.1.2.3 Exp retval) { 24 cananian 1.1.2.13 super(tf, source, 1); 25 cananian 1.3.2.1 assert retval!=null; 26 duncan 1.1.2.11 this.setRetval(retval); 27 cananian 1.3.2.1 assert tf == retval.tf : "This and Retval must have same tree factory"; 28 duncan 1.1.2.3 } 29 duncan 1.1.2.11 30 cananian 1.1.2.13 /** Returns the value to return. */ 31 cananian 1.1.2.13 public Exp getRetval() { return (Exp) getChild(0); } 32 cananian 1.1.2.13 /** Sets the value to return. */ 33 cananian 1.1.2.13 public void setRetval(Exp retval) { setChild(0, retval); } 34 duncan 1.1.2.11 35 duncan 1.1.2.3 public int kind() { return TreeKind.RETURN; } 36 duncan 1.1.2.7 37 duncan 1.1.2.7 public Stm build(TreeFactory tf, ExpList kids) { 38 cananian 1.3.2.1 assert kids!=null && kids.tail==null; 39 cananian 1.3.2.1 assert tf == kids.head.tf; 40 duncan 1.1.2.3 return new RETURN(tf, this, kids.head); 41 duncan 1.1.2.3 } 42 duncan 1.1.2.1 43 duncan 1.1.2.3 /** Accept a visitor */ 44 cananian 1.1.2.10 public void accept(TreeVisitor v) { v.visit(this); } 45 duncan 1.1.2.1 46 cananian 1.1.2.14 public Tree rename(TreeFactory tf, TempMap tm, CloneCallback cb) { 47 cananian 1.1.2.15 return cb.callback(this, new RETURN(tf, this, (Exp)getRetval().rename(tf, tm, cb)), tm); 48 duncan 1.1.2.3 } 49 andyb 1.1.2.2 50 cananian 1.1.2.4 /** @return the type of the return value expression */ 51 cananian 1.1.2.13 public int type() { return getRetval().type(); } 52 cananian 1.1.2.13 public boolean isDoubleWord() { return getRetval().isDoubleWord(); } 53 cananian 1.1.2.13 public boolean isFloatingPoint() { return getRetval().isFloatingPoint(); } 54 cananian 1.1.2.4 55 duncan 1.1.2.3 public String toString() { 56 cananian 1.1.2.13 return "RETURN(#"+getRetval().getID()+")"; 57 duncan 1.1.2.3 } 58 duncan 1.1.2.1 59 cananian 1.2 }