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 }