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     }