1 cananian 1.1.2.1 // METHOD.java, created Tue Dec 15 14:20:38 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.6 import harpoon.ClassFile.HCodeElement; 7 cananian 1.1.2.1 import harpoon.Temp.Temp; 8 cananian 1.1.2.1 import harpoon.Temp.TempMap; 9 cananian 1.1.2.1 import harpoon.Util.Util; 10 cananian 1.1.2.1 11 cananian 1.1.2.1 /** 12 cananian 1.1.2.9 * <code>Quads.METHOD</code> nodes encode method-specific information: 13 cananian 1.1.2.1 * the mapping of method formals to temporary variables, and 14 cananian 1.1.2.7 * links to the exception handlers for the method. <p> 15 cananian 1.1.2.9 * The 0-edge out of the <code>Quads.METHOD</code> quad points to the 16 cananian 1.1.2.1 * beginning of the executable code for the method. Other 17 cananian 1.1.2.1 * edges point to <code>HANDLER</code> quads defining execution 18 cananian 1.1.2.1 * handlers. The lowest-numbered <code>HANDLER</code> edge 19 cananian 1.1.2.1 * (ie, the 1-edge) is the innermost nested try-block. 20 cananian 1.1.2.1 * 21 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 22 cananian 1.5 * @version $Id: METHOD.java,v 1.5 2002/04/11 04:00:34 cananian Exp $ 23 cananian 1.1.2.1 * @see HEADER 24 cananian 1.1.2.1 * @see HANDLER 25 cananian 1.1.2.1 */ 26 cananian 1.1.2.1 public class METHOD extends Quad { 27 cananian 1.1.2.1 /** the temporary variables used for method formals. */ 28 cananian 1.1.2.1 protected Temp[] params; 29 cananian 1.1.2.1 30 cananian 1.1.2.9 /** Creates a <code>Quads.METHOD</code> quad. 31 cananian 1.1.2.1 * @param params the <code>Temp</code>s in which the formal parameters 32 cananian 1.1.2.1 * of the method will be passed. 33 cananian 1.1.2.1 * @param arity the number of outgoing edges from this 34 cananian 1.1.2.9 * <code>Quads.METHOD</code>. Always at least one. 35 cananian 1.1.2.1 * The number of exception handlers for this method is 36 cananian 1.1.2.1 * <code>(arity-1)</code>. 37 cananian 1.1.2.1 */ 38 cananian 1.1.2.1 public METHOD(QuadFactory qf, HCodeElement source, 39 cananian 1.1.2.1 Temp[] params, int arity) { 40 cananian 1.1.2.1 super(qf, source, 1 /* predecessor is HEADER */, arity); 41 cananian 1.3.2.1 assert arity>=1; 42 cananian 1.3.2.1 assert params!=null; 43 cananian 1.1.2.1 this.params = params; 44 cananian 1.1.2.1 } 45 cananian 1.1.2.9 /** Returns the arity of this <code>Quads.METHOD</code>. */ 46 cananian 1.1.2.1 public int arity() { return next.length; } 47 cananian 1.1.2.1 /** Returns the <code>params</code> array which associates 48 cananian 1.1.2.1 * <code>Temp</code>s with formal parameters of a method. */ 49 cananian 1.1.2.1 public Temp[] params() 50 cananian 1.1.2.1 { return (Temp[]) Util.safeCopy(Temp.arrayFactory, params); } 51 cananian 1.1.2.1 /** Returns a specified member of the <code>params</code> array. */ 52 cananian 1.1.2.1 public Temp params(int i) { return params[i]; } 53 cananian 1.1.2.1 /** Returns the length of the <code>params</code> array. */ 54 cananian 1.1.2.1 public int paramsLength() { return params.length; } 55 cananian 1.1.2.3 56 cananian 1.1.2.9 /** Determines whether the parameters defined in this <code>Quads.METHOD</code> 57 cananian 1.1.2.3 * belong to a static method. */ 58 cananian 1.1.2.4 public boolean isStatic() { return qf.getMethod().isStatic(); } 59 cananian 1.1.2.1 60 cananian 1.1.2.1 /** Returns the <code>Temp</code>s defined by this <code>Quad</code>. */ 61 cananian 1.1.2.1 public Temp[] def() { 62 cananian 1.1.2.1 return (Temp[]) Util.safeCopy(Temp.arrayFactory, params); 63 cananian 1.1.2.1 } 64 cananian 1.1.2.1 65 cananian 1.1.2.1 public int kind() { return QuadKind.METHOD; } 66 cananian 1.1.2.1 67 cananian 1.1.2.2 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 68 cananian 1.1.2.2 return new METHOD(qqf, this, map(defMap, params), arity()); 69 cananian 1.1.2.1 } 70 cananian 1.1.2.2 /** Rename all defined variables in this <code>Quad</code>. 71 cananian 1.1.2.2 * @deprecated does not preserve immutability. */ 72 cananian 1.1.2.1 void renameDefs(TempMap tm) { 73 cananian 1.1.2.1 for (int i=0; i<params.length; i++) 74 cananian 1.1.2.1 params[i] = tm.tempMap(params[i]); 75 cananian 1.1.2.1 } 76 cananian 1.1.2.1 77 cananian 1.1.2.8 public void accept(QuadVisitor v) { v.visit(this); } 78 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 79 cananian 1.1.2.1 80 cananian 1.1.2.1 /** Returns human-readable representation of this <code>Quad</code>. */ 81 cananian 1.1.2.1 public String toString() { 82 cananian 1.1.2.1 StringBuffer sb = new StringBuffer("METHOD("); 83 cananian 1.1.2.1 for (int i=0; i<params.length; i++) { 84 cananian 1.1.2.1 sb.append(params[i].toString()); 85 cananian 1.1.2.1 if (i<params.length-1) 86 cananian 1.1.2.1 sb.append(", "); 87 cananian 1.1.2.1 } 88 cananian 1.1.2.1 sb.append(")"); 89 cananian 1.1.2.1 return sb.toString(); 90 cananian 1.1.2.1 } 91 cananian 1.2 }