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 }