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     }