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     }