1 cananian 1.1.2.1  // SEQ.java, created Wed Jan 13 21:14:57 1999 by cananian
 2 cananian 1.1.2.11 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.11 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1  package harpoon.IR.Tree;
 5 cananian 1.1.2.1  
 6 cananian 1.1.2.3  import harpoon.ClassFile.HCodeElement;
 7 cananian 1.1.2.18 import harpoon.Temp.TempMap;
 8 cananian 1.1.2.3  import harpoon.Util.Util;
 9 cananian 1.1.2.3  
10 cananian 1.1.2.13 import java.util.Collections;
11 duncan   1.1.2.8  import java.util.Set;
12 duncan   1.1.2.6  
13 cananian 1.1.2.1  /**
14 cananian 1.1.2.1   * <code>SEQ</code> evaluates the left statement followed by the right
15 cananian 1.1.2.1   * statement.
16 cananian 1.1.2.1   * 
17 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>, based on
18 cananian 1.1.2.1   *          <i>Modern Compiler Implementation in Java</i> by Andrew Appel.
19 salcianu 1.7       * @version $Id: SEQ.java,v 1.7 2003/06/04 15:45:47 salcianu Exp $
20 cananian 1.1.2.1   */
21 cananian 1.1.2.12 public class SEQ extends Stm implements harpoon.ClassFile.HDataElement {
22 cananian 1.1.2.1      /** Constructor. */
23 cananian 1.1.2.3      public SEQ(TreeFactory tf, HCodeElement source,
24 cananian 1.1.2.3                 Stm left, Stm right) {
25 cananian 1.1.2.17         super(tf, source, 2);
26 cananian 1.3.2.1          assert left!=null && right!=null;
27 cananian 1.3.2.1          assert left.tf == right.tf : "Left and Right must have same tree factory";
28 cananian 1.3.2.1          assert tf == right.tf : "This and Right must have same tree factory";
29 cananian 1.1.2.17         setLeft(left); setRight(right);
30 pnkfelix 1.1.2.15 
31 pnkfelix 1.1.2.16         // FSK: debugging hack
32 pnkfelix 1.1.2.16         // this.accept(TreeVerifyingVisitor.norepeats());
33 pnkfelix 1.1.2.15 
34 duncan   1.1.2.14     }
35 duncan   1.1.2.14     
36 salcianu 1.5          /** Convenient constructor: the tree factory and the source
37 salcianu 1.7              arguments are identical to those for the left and the right
38 salcianu 1.7              statements (those statements must have the same tree factory
39 salcianu 1.7              and source).
40 salcianu 1.5      
41 salcianu 1.5              @param left Statement executed first
42 salcianu 1.5              @param right Statement executed second */
43 salcianu 1.5          public SEQ(Stm left, Stm right) {
44 salcianu 1.5              this(left.tf, left, left, right);
45 salcianu 1.5          }
46 salcianu 1.5      
47 cananian 1.1.2.17     /** Returns the statement to evaluate first. */
48 cananian 1.1.2.17     public Stm getLeft() { return (Stm) getChild(0); }
49 cananian 1.1.2.17     /** Returns the statement to evaluate last. */
50 cananian 1.1.2.17     public Stm getRight() { return (Stm) getChild(1); } 
51 cananian 1.1.2.17 
52 cananian 1.1.2.17     /** Sets the statement to evaluate first. */
53 cananian 1.1.2.17     public void setLeft(Stm left) { setChild(0, left); }
54 cananian 1.1.2.17     /** Sets the statement to evaluate last. */
55 cananian 1.1.2.17     public void setRight(Stm right) { setChild(1, right); }
56 duncan   1.1.2.6  
57 cananian 1.1.2.1      public ExpList kids() {throw new Error("kids() not applicable to SEQ");}
58 duncan   1.1.2.7      public int kind() { return TreeKind.SEQ; }
59 duncan   1.1.2.7  
60 duncan   1.1.2.10     public Stm build(TreeFactory tf, ExpList kids) {throw new Error("build() not applicable to SEQ");}
61 duncan   1.1.2.2      /** Accept a visitor */
62 cananian 1.1.2.13     public void accept(TreeVisitor v) { v.visit(this); }
63 duncan   1.1.2.4  
64 cananian 1.1.2.18     public Tree rename(TreeFactory tf, TempMap tm, CloneCallback cb) {
65 cananian 1.1.2.18         return cb.callback(this, new SEQ(tf, this, 
66 cananian 1.1.2.18                                          (Stm)getLeft().rename(tf, tm, cb),
67 cananian 1.1.2.19                                          (Stm)getRight().rename(tf, tm, cb)),
68 cananian 1.1.2.19                            tm);
69 andyb    1.1.2.5      }
70 andyb    1.1.2.5  
71 andyb    1.1.2.5      public String toString() {
72 cananian 1.1.2.17         return "SEQ(#"+getLeft().getID()+", #"+getRight().getID()+")";
73 duncan   1.1.2.4      }
74 cananian 1.1.2.1  }
75 cananian 1.2