1 cananian 1.1.2.1  // FOOTER.java, created Mon Sep  7 10:36:08 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.9  import harpoon.ClassFile.HCodeElement;
 7 cananian 1.1.2.1  import harpoon.Temp.TempMap;
 8 cananian 1.1.2.1  import harpoon.Util.Util;
 9 cananian 1.1.2.1  /**
10 cananian 1.1.2.1   * <code>FOOTER</code> nodes are used to anchor the bottom end of the quad
11 cananian 1.1.2.1   * graph.  They do not represent bytecode and are not executable. <p>
12 cananian 1.1.2.1   * <code>RETURN</code> and <code>THROW</code> nodes should have a 
13 cananian 1.1.2.1   * <code>FOOTER</code> node as their only successor.
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: FOOTER.java,v 1.3 2002/04/11 04:00:34 cananian Exp $
17 cananian 1.1.2.1   * @see HEADER
18 cananian 1.1.2.1   * @see RETURN
19 cananian 1.1.2.1   * @see THROW
20 cananian 1.1.2.1   */
21 cananian 1.1.2.1  
22 cananian 1.1.2.1  public class FOOTER extends Quad {
23 cananian 1.1.2.1      
24 cananian 1.1.2.1      /** Creates a <code>FOOTER</code>. */
25 cananian 1.1.2.4      public FOOTER(QuadFactory qf, HCodeElement source, int arity) {
26 cananian 1.1.2.4          super(qf, source, arity/*num predecessors*/, 0/*no successors ever*/);
27 cananian 1.1.2.1      }
28 cananian 1.1.2.4      /** Returns the number of predecessors of this <Code>FOOTER</code>. */
29 cananian 1.1.2.4      public int arity() { return prev.length; }
30 cananian 1.1.2.1  
31 cananian 1.1.2.8      /** Attach a new Quad to this <code>FOOTER</code> by replacing it.
32 cananian 1.1.2.12      * @param q the new <code>Quad</code> to attach.
33 cananian 1.1.2.12      * @param which_succ the edge leaving q to attach to the
34 cananian 1.1.2.12      *                   <code>FOOTER</code>.
35 cananian 1.1.2.8       * @return the new <code>FOOTER</code>. */
36 cananian 1.1.2.8      public FOOTER attach(Quad q, int which_succ) {
37 cananian 1.1.2.10         FOOTER f = resize(arity()+1);
38 cananian 1.1.2.4          addEdge(q, which_succ, f, arity());
39 cananian 1.1.2.8          return f;
40 cananian 1.1.2.1      }
41 cananian 1.1.2.10     /** Change the arity of this <code>FOOTER</code> by replacing it.
42 cananian 1.1.2.12      *  The new edges if any are the highest numbered incoming
43 cananian 1.1.2.12      *  edges and are left null. */
44 cananian 1.1.2.10     public FOOTER resize(int new_arity) {
45 cananian 1.1.2.10         FOOTER f = new FOOTER(qf, this, new_arity);
46 cananian 1.1.2.10         for (int i=0; i<arity() && i<new_arity; i++)
47 cananian 1.1.2.10             Quad.addEdge(this.prev(i), this.prevEdge(i).which_succ(), f, i);
48 cananian 1.1.2.10         return f;
49 cananian 1.1.2.10     }
50 cananian 1.1.2.10 
51 cananian 1.1.2.5      /** Remove an attachment from this <code>FOOTER</code> by replacing
52 cananian 1.1.2.8       *  the footer.
53 cananian 1.1.2.12      * @param which_pred which incoming edge to remove.
54 cananian 1.1.2.8       * @return the new <code>FOOTER</code>. */
55 cananian 1.1.2.8      public FOOTER remove(int which_pred) {
56 cananian 1.1.2.4          FOOTER f = new FOOTER(qf, this, arity()-1);
57 cananian 1.1.2.4          for (int i=0, j=0; i<prev.length; i++)
58 cananian 1.1.2.4              if (i!=which_pred) {
59 cananian 1.1.2.4                  Edge e = prevEdge(i);
60 cananian 1.1.2.4                  Quad.addEdge((Quad)e.from(), e.which_succ(), f, j++);
61 cananian 1.1.2.4              }
62 cananian 1.1.2.8          return f;
63 cananian 1.1.2.1      }
64 cananian 1.1.2.1  
65 cananian 1.1.2.2      public int kind() { return QuadKind.FOOTER; }
66 cananian 1.1.2.2  
67 cananian 1.1.2.7      public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) {
68 cananian 1.1.2.4          return new FOOTER(qqf, this, prev.length);
69 cananian 1.1.2.2      }
70 cananian 1.1.2.1  
71 cananian 1.1.2.11     public void accept(QuadVisitor v) { v.visit(this); }
72 cananian 1.3          public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); }
73 cananian 1.1.2.1  
74 cananian 1.1.2.5      /** Returns human-readable representation of this <code>Quad</code>. */
75 cananian 1.1.2.4      public String toString() { return "FOOTER("+arity()+")"; }
76 cananian 1.2      }