1 cananian 1.1.2.1 // TYPECAST.java, created Thu Dec 31 11:12:40 1998 by cananian
 2 cananian 1.1.2.3 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.3 // 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.2 import harpoon.ClassFile.HClass;
 7 cananian 1.1.2.2 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.1 import harpoon.Util.Util;
11 cananian 1.1.2.1 
12 cananian 1.1.2.1 /**
13 cananian 1.1.2.1  * <code>TYPECAST</code> performs a typecast on a given variable.
14 cananian 1.1.2.1  * It throws an exception if the <code>Temp</code> cannot be type cast
15 cananian 1.1.2.1  * as requested.  It is similar to the bytecode <code>checkcast</code>
16 cananian 1.1.2.1  * instruction.
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: TYPECAST.java,v 1.5 2002/04/11 04:00:35 cananian Exp $
20 cananian 1.1.2.1  */
21 cananian 1.1.2.1 public class TYPECAST extends NOP {
22 cananian 1.1.2.1     /** The <code>Temp</code> to type cast. */
23 cananian 1.1.2.1     protected Temp objectref;
24 cananian 1.1.2.1     /** The class to cast to. */
25 cananian 1.1.2.1     final protected HClass hclass;
26 cananian 1.1.2.1 
27 cananian 1.1.2.1     /** Creates a <code>TYPECAST</code> representing a type cast.
28 cananian 1.1.2.1      * @param objectref
29 cananian 1.1.2.1      *        the <code>Temp</code> to type cast.
30 cananian 1.1.2.1      * @param hclass
31 cananian 1.1.2.1      *        the class to cast to.
32 cananian 1.1.2.1      */
33 cananian 1.1.2.1     public TYPECAST(QuadFactory qf, HCodeElement source,
34 cananian 1.1.2.1                     Temp objectref, HClass hclass) {
35 cananian 1.1.2.1         super(qf, source);
36 cananian 1.1.2.1         this.objectref = objectref;
37 cananian 1.1.2.1         this.hclass = hclass;
38 cananian 1.1.2.1         // VERIFY LEGALITY
39 cananian 1.3.2.1         assert objectref!=null && hclass!=null;
40 cananian 1.1.2.1     }
41 cananian 1.1.2.1     // ACCESSOR METHODS:
42 cananian 1.1.2.1     /** Return the <code>Temp</code> type cast by this <code>TYPECAST</code>.*/
43 cananian 1.1.2.1     public Temp objectref() { return objectref; }
44 cananian 1.1.2.1     /** Return the class of this <code>TYPECAST</code>. */
45 cananian 1.1.2.1     public HClass hclass() { return hclass; }
46 cananian 1.1.2.1 
47 cananian 1.1.2.1     /** Returns the <code>Temp</code>s used by this quad. */
48 cananian 1.1.2.1     public Temp[] use() { return new Temp[] { objectref }; }
49 cananian 1.1.2.1 
50 cananian 1.1.2.1     public int kind() { return QuadKind.TYPECAST; }
51 cananian 1.1.2.1 
52 cananian 1.1.2.1     public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) {
53 cananian 1.1.2.1         return new TYPECAST(qqf, this, map(useMap,objectref), hclass);
54 cananian 1.1.2.1     }
55 cananian 1.1.2.1 
56 cananian 1.1.2.1     /** Rename all used variables in this <code>Quad</code> according to
57 cananian 1.1.2.1      *  a mapping.
58 cananian 1.1.2.1      * @deprecated does not preserve immutability. */
59 cananian 1.1.2.1     void renameUses(TempMap tm) {
60 cananian 1.1.2.1         objectref = tm.tempMap(objectref);
61 cananian 1.1.2.1     }
62 cananian 1.1.2.1 
63 cananian 1.1.2.4     public void accept(QuadVisitor v) { v.visit(this); }
64 cananian 1.5         public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); }
65 cananian 1.1.2.1 
66 cananian 1.1.2.1     /** Returns a human-readable representation of this <code>Quad</code>. */
67 cananian 1.1.2.1     public String toString() {
68 cananian 1.1.2.1         return "TYPECAST ("+hclass.getName()+") "+objectref.toString();
69 cananian 1.1.2.1     }
70 cananian 1.2     }