1 cananian 1.1.2.1 // PMOFFSET.java, created Wed Jan 20 21:47:52 1999 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1999 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.LowQuad;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement;
 7 cananian 1.1.2.1 import harpoon.ClassFile.HConstructor;
 8 cananian 1.1.2.1 import harpoon.ClassFile.HMethod;
 9 cananian 1.1.2.1 import harpoon.Temp.Temp;
10 cananian 1.1.2.1 import harpoon.Temp.TempMap;
11 cananian 1.1.2.1 import harpoon.Util.Util;
12 cananian 1.1.2.1 
13 cananian 1.1.2.1 import java.lang.reflect.Modifier;
14 cananian 1.1.2.1 /**
15 cananian 1.1.2.1  * <code>PMOFFSET</code> computes the <code>POINTER</code> offset
16 cananian 1.1.2.1  * needed to invoke a given <b>virtual</b> method. Non-virtual methods
17 cananian 1.1.2.1  * are invoked via the <code>POINTER</code> obtained from
18 cananian 1.1.2.1  * <code>PMCONST</code>.
19 cananian 1.1.2.1  * 
20 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
21 cananian 1.5      * @version $Id: PMOFFSET.java,v 1.5 2002/04/11 04:00:21 cananian Exp $
22 cananian 1.1.2.1  */
23 cananian 1.1.2.1 public class PMOFFSET extends PCONST {
24 cananian 1.1.2.1     /** The <code>HMethod</code> to address. */
25 cananian 1.1.2.1     protected final HMethod method;
26 cananian 1.1.2.1 
27 cananian 1.1.2.1     /** Creates a <code>PMOFFSET</code> representing the <code>POINTER</code>
28 cananian 1.1.2.1      *  offset needed to invoke a given <b>virtual</b> method.
29 cananian 1.1.2.1      * @param dst
30 cananian 1.1.2.1      *        the <code>Temp</code> in which to store the computed offset.
31 cananian 1.1.2.1      * @param method
32 cananian 1.1.2.1      *        the <code>HMethod</code> whose offset to compute.
33 cananian 1.1.2.1      */
34 cananian 1.1.2.1     public PMOFFSET(LowQuadFactory qf, HCodeElement source,
35 cananian 1.1.2.1                     final Temp dst, final HMethod method) {
36 cananian 1.1.2.1         super(qf, source, dst);
37 cananian 1.1.2.1         this.method = method;
38 cananian 1.3.2.1         assert method!=null && !method.isStatic() &&
39 cananian 1.1.2.1                     !(method instanceof HConstructor) &&
40 cananian 1.3.2.1                     !Modifier.isPrivate(method.getModifiers());
41 cananian 1.1.2.1     }
42 cananian 1.1.2.1     // ACCESSOR METHODS:
43 cananian 1.1.2.1     /** Returns the method whose offset is computed. */
44 cananian 1.1.2.1     public HMethod method() { return method; }
45 cananian 1.1.2.1 
46 cananian 1.1.2.1     public int kind() { return LowQuadKind.PMOFFSET; }
47 cananian 1.1.2.1 
48 cananian 1.1.2.1     public harpoon.IR.Quads.Quad rename(harpoon.IR.Quads.QuadFactory qf,
49 cananian 1.1.2.1                                         TempMap defMap, TempMap useMap) {
50 cananian 1.1.2.1         return new PMOFFSET((LowQuadFactory)qf, this,
51 cananian 1.1.2.1                             map(defMap, dst), method);
52 cananian 1.1.2.1     }
53 cananian 1.1.2.1 
54 cananian 1.1.2.2     void accept(LowQuadVisitor v) { v.visit(this); }
55 cananian 1.5         <T> T accept(LowQuadValueVisitor<T> v) { return v.visit(this); }
56 cananian 1.1.2.1 
57 cananian 1.1.2.1     public String toString() {
58 cananian 1.1.2.1         return dst.toString() + " = PMOFFSET " +
59 cananian 1.1.2.1             method.getDeclaringClass().getName()+"."+method.getName();
60 cananian 1.1.2.1     }
61 cananian 1.2     }