1 cananian 1.1.2.1 // AGET.java, created Wed Aug 26 19:02:57 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.9 import harpoon.ClassFile.HClass; 7 cananian 1.1.2.7 import harpoon.ClassFile.HCodeElement; 8 cananian 1.1.2.1 import harpoon.Temp.Temp; 9 cananian 1.1.2.1 import harpoon.Temp.TempMap; 10 cananian 1.1.2.2 import harpoon.Util.Util; 11 cananian 1.1.2.1 12 cananian 1.1.2.1 /** 13 cananian 1.1.2.1 * <code>AGET</code> represents an element fetch from an array object. 14 cananian 1.1.2.1 * 15 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 16 cananian 1.5 * @version $Id: AGET.java,v 1.5 2002/04/11 04:00:28 cananian Exp $ 17 cananian 1.1.2.1 * @see ANEW 18 cananian 1.1.2.1 * @see ASET 19 cananian 1.1.2.1 * @see ALENGTH 20 cananian 1.1.2.1 */ 21 cananian 1.1.2.1 public class AGET extends Quad { 22 cananian 1.1.2.2 /** The <code>Temp</code> in which to store the fetched element. */ 23 cananian 1.1.2.2 protected Temp dst; 24 cananian 1.1.2.1 /** The array reference. */ 25 cananian 1.1.2.2 protected Temp objectref; 26 cananian 1.1.2.2 /** The <code>Temp</code> holding the index of the element to get. */ 27 cananian 1.1.2.2 protected Temp index; 28 cananian 1.1.2.9 /** The component type of the referenced array. */ 29 cananian 1.1.2.9 protected HClass type; 30 cananian 1.1.2.1 31 cananian 1.1.2.2 /** Creates an <code>AGET</code> object representing an element 32 cananian 1.1.2.2 * fetch from an array object. 33 cananian 1.1.2.2 * @param dst 34 cananian 1.1.2.2 * the <code>Temp</code> in which to store the fetched element. 35 cananian 1.1.2.2 * @param objectref 36 cananian 1.1.2.2 * the array reference. 37 cananian 1.1.2.2 * @param index 38 cananian 1.1.2.2 * the <code>Temp</code> holding the index of the element to get. 39 cananian 1.1.2.9 * @param type 40 cananian 1.1.2.9 * the component type of the referenced array. 41 cananian 1.1.2.2 */ 42 cananian 1.1.2.4 public AGET(QuadFactory qf, HCodeElement source, 43 cananian 1.1.2.9 Temp dst, Temp objectref, Temp index, HClass type) { 44 cananian 1.1.2.4 super(qf, source); 45 cananian 1.1.2.1 this.dst = dst; 46 cananian 1.1.2.1 this.objectref = objectref; 47 cananian 1.1.2.1 this.index = index; 48 cananian 1.1.2.9 this.type = type.isPrimitive() ? type : 49 cananian 1.1.2.9 type.getLinker().forDescriptor("Ljava/lang/Object;"); 50 cananian 1.1.2.2 // VERIFY legality of this AGET. 51 cananian 1.3.2.1 assert dst!=null && objectref!=null && index!=null; 52 cananian 1.1.2.1 } 53 cananian 1.1.2.2 /** Returns the destination <code>Temp</code>. */ 54 cananian 1.1.2.2 public Temp dst() { return dst; } 55 cananian 1.1.2.2 /** Returns the array reference <code>Temp</code>. */ 56 cananian 1.1.2.2 public Temp objectref() { return objectref; } 57 cananian 1.1.2.2 /** Returns the <code>Temp</code> holding the index of the element 58 cananian 1.1.2.2 * to fetch. */ 59 cananian 1.1.2.2 public Temp index() { return index; } 60 cananian 1.1.2.9 /** Returns the component type of the referenced array. All 61 cananian 1.1.2.9 * non-primitive types become <code>Object</code>. */ 62 cananian 1.1.2.9 public HClass type() { return type; } 63 cananian 1.1.2.1 64 cananian 1.1.2.5 /** Returns the <code>Temp</code> defined by this quad. 65 cananian 1.1.2.1 * @return the <code>dst</code> field. */ 66 cananian 1.1.2.1 public Temp[] def() { return new Temp[] { dst }; } 67 cananian 1.1.2.5 /** Returns all the <code>Temp</code>s used by this quad. 68 cananian 1.1.2.1 * @return the <code>objectref</code> and <code>index</code> fields. */ 69 cananian 1.1.2.1 public Temp[] use() { return new Temp[] { objectref, index }; } 70 cananian 1.1.2.1 71 cananian 1.1.2.3 public int kind() { return QuadKind.AGET; } 72 cananian 1.1.2.3 73 cananian 1.1.2.6 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 74 cananian 1.1.2.6 return new AGET(qqf, this, map(defMap,dst), 75 cananian 1.1.2.9 map(useMap,objectref), map(useMap,index), type); 76 cananian 1.1.2.3 } 77 cananian 1.1.2.5 /** Rename all used variables in this <code>Quad</code> according 78 cananian 1.1.2.6 * to a mapping. 79 cananian 1.1.2.6 * @deprecated does not preserve immutability. */ 80 cananian 1.1.2.3 void renameUses(TempMap tm) { 81 cananian 1.1.2.1 objectref = tm.tempMap(objectref); 82 cananian 1.1.2.1 index = tm.tempMap(index); 83 cananian 1.1.2.1 } 84 cananian 1.1.2.5 /** Rename all defined variables in this <code>Quad</code> according 85 cananian 1.1.2.6 * to a mapping. 86 cananian 1.1.2.6 * @deprecated does not preserve immutability. */ 87 cananian 1.1.2.3 void renameDefs(TempMap tm) { 88 cananian 1.1.2.1 dst = tm.tempMap(dst); 89 cananian 1.1.2.1 } 90 cananian 1.1.2.3 91 cananian 1.1.2.8 public void accept(QuadVisitor v) { v.visit(this); } 92 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 93 cananian 1.1.2.1 94 cananian 1.1.2.1 /** Returns a human-readable representation of this quad. */ 95 cananian 1.1.2.1 public String toString() { 96 cananian 1.1.2.9 return dst.toString() + " = ("+type.getName()+") AGET " + objectref + "["+index+"]"; 97 cananian 1.1.2.1 } 98 cananian 1.2 }