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 }