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      }