1 cananian 1.1.2.1 // GET.java, created Wed Aug 5 07:05:59 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.1 import java.lang.reflect.Modifier; 7 cananian 1.1.2.1 8 cananian 1.1.2.6 import harpoon.ClassFile.HCodeElement; 9 cananian 1.1.2.6 import harpoon.ClassFile.HField; 10 cananian 1.1.2.1 import harpoon.Temp.Temp; 11 cananian 1.1.2.1 import harpoon.Temp.TempMap; 12 cananian 1.1.2.1 import harpoon.Util.Util; 13 cananian 1.1.2.2 14 cananian 1.1.2.1 /** 15 cananian 1.1.2.1 * <code>GET</code> represent field access (get) operations. 16 cananian 1.1.2.1 * The <code>objectref</code> is null if the field is static. 17 cananian 1.1.2.1 * 18 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 19 cananian 1.5 * @version $Id: GET.java,v 1.5 2002/04/11 04:00:34 cananian Exp $ 20 cananian 1.1.2.1 */ 21 cananian 1.1.2.1 public class GET extends Quad { 22 cananian 1.1.2.2 /** <code>Temp</code> in which to store the fetched field contents. */ 23 cananian 1.1.2.2 protected Temp dst; 24 cananian 1.1.2.2 /** The field description. */ 25 cananian 1.1.2.2 final protected HField field; 26 cananian 1.1.2.1 /** Reference to the object containing the field. <p> 27 cananian 1.1.2.1 * <code>null</code> if field is static. */ 28 cananian 1.1.2.2 protected Temp objectref; 29 cananian 1.1.2.1 30 cananian 1.1.2.2 /** Creates a <code>GET</code> representing a field access. 31 cananian 1.1.2.2 * @param dst 32 cananian 1.1.2.2 * the <code>Temp</code> in which to store the fetched field. 33 cananian 1.1.2.2 * @param field 34 cananian 1.1.2.2 * the field description. 35 cananian 1.1.2.2 * @param objectref 36 cananian 1.1.2.2 * the <code>Temp</code> referencing the object 37 cananian 1.1.2.2 * containing the specified field, if the field is not static. 38 cananian 1.1.2.2 * For static fields, <code>objectref</code> is <code>null</code>. 39 cananian 1.1.2.2 */ 40 cananian 1.1.2.4 public GET(QuadFactory qf, HCodeElement source, 41 cananian 1.1.2.1 Temp dst, HField field, Temp objectref) { 42 cananian 1.1.2.4 super(qf, source); 43 cananian 1.1.2.1 this.dst = dst; 44 cananian 1.1.2.1 this.field = field; 45 cananian 1.1.2.1 this.objectref = objectref; 46 cananian 1.1.2.2 // VERIFY legality of GET 47 cananian 1.3.2.1 assert dst!=null && field!=null; 48 cananian 1.1.2.2 if (isStatic()) 49 cananian 1.3.2.1 assert objectref==null; 50 cananian 1.1.2.2 else 51 cananian 1.3.2.1 assert objectref!=null; 52 cananian 1.1.2.1 } 53 cananian 1.1.2.2 // ACCESSOR METHODS: 54 cananian 1.1.2.2 /** Returns the <code>Temp</code> in which to store the fetched field. */ 55 cananian 1.1.2.2 public Temp dst() { return dst; } 56 cananian 1.1.2.2 /** Returns the field to fetch. */ 57 cananian 1.1.2.2 public HField field() { return field; } 58 cananian 1.1.2.2 /** Returns the object containing the specified field, or 59 cananian 1.1.2.2 * <code>null</code> if the field is static. */ 60 cananian 1.1.2.2 public Temp objectref() { return objectref; } 61 cananian 1.1.2.1 62 cananian 1.1.2.1 /** Returns the Temp used by this Quad. 63 cananian 1.1.2.1 * @return the <code>objectref</code> field. */ 64 cananian 1.1.2.1 public Temp[] use() { 65 cananian 1.1.2.1 if (objectref==null) return new Temp[0]; 66 cananian 1.1.2.1 else return new Temp[] { objectref }; 67 cananian 1.1.2.1 } 68 cananian 1.1.2.1 /** Returns the Temp defined by this Quad. 69 cananian 1.1.2.1 * @return the <code>dst</code> field. */ 70 cananian 1.1.2.1 public Temp[] def() { return new Temp[] { dst }; } 71 cananian 1.1.2.1 72 cananian 1.1.2.3 public int kind() { return QuadKind.GET; } 73 cananian 1.1.2.3 74 cananian 1.1.2.5 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 75 cananian 1.1.2.5 return new GET(qqf, this, 76 cananian 1.1.2.5 map(defMap,dst), field, map(useMap,objectref)); 77 cananian 1.1.2.3 } 78 cananian 1.1.2.5 /** Rename all used variables in this Quad according to a mapping. 79 cananian 1.1.2.5 * @deprecated does not preserve immutability. */ 80 cananian 1.1.2.3 void renameUses(TempMap tm) { 81 cananian 1.1.2.1 if (objectref!=null) 82 cananian 1.1.2.1 objectref = tm.tempMap(objectref); 83 cananian 1.1.2.1 } 84 cananian 1.1.2.5 /** Rename all defined variables in this Quad according to a mapping. 85 cananian 1.1.2.5 * @deprecated does not preserve immutability. */ 86 cananian 1.1.2.3 void renameDefs(TempMap tm) { 87 cananian 1.1.2.1 dst = tm.tempMap(dst); 88 cananian 1.1.2.1 } 89 cananian 1.1.2.1 90 cananian 1.1.2.7 public void accept(QuadVisitor v) { v.visit(this); } 91 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 92 cananian 1.1.2.1 93 cananian 1.1.2.1 /** Returns human-readable representation. */ 94 cananian 1.1.2.1 public String toString() { 95 cananian 1.1.2.1 StringBuffer sb = new StringBuffer(dst.toString()+" = GET "); 96 cananian 1.1.2.1 if (isStatic()) 97 cananian 1.1.2.1 sb.append("static "); 98 cananian 1.1.2.1 sb.append(field.getDeclaringClass().getName() + "." + field.getName()); 99 cananian 1.1.2.1 if (objectref!=null) 100 cananian 1.1.2.1 sb.append(" of " + objectref); 101 cananian 1.1.2.1 return sb.toString(); 102 cananian 1.1.2.1 } 103 cananian 1.1.2.1 /** Determines whether the GET is of a static field. */ 104 cananian 1.1.2.1 public boolean isStatic() { return field.isStatic(); } 105 cananian 1.2 }