1 cananian 1.1.2.1 // CONST.java, created Mon Aug 24 16:46:52 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.7 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.1 import harpoon.Util.Util; 11 cananian 1.1.2.1 /** 12 cananian 1.1.2.1 * <code>CONST</code> objects represent an assignment of a constant value 13 cananian 1.1.2.9 * to a compiler temporary. <p> 14 cananian 1.1.2.1 * The <code>type</code> field of a <code>CONST</code> must be one of: 15 cananian 1.1.2.12 * <code>Class</code>, <code>Field</code>, <code>Method</code>, 16 cananian 1.1.2.1 * <code>String</code>, <code>int</code>, <code>long</code>, 17 cananian 1.1.2.5 * <code>float</code>, <code>double</code> or <code>void</code>. 18 cananian 1.1.2.1 * A <code>void</code> type corresponds to a <code>null</code> literal 19 cananian 1.1.2.1 * constant, and in this case the <code>value</code> field will be 20 cananian 1.1.2.12 * <code>null</code>. For class, field, and method constants, the 21 cananian 1.1.2.12 * <code>value</code> field will contain an instance of <code>HClass</code>, 22 cananian 1.1.2.12 * <code>HField</code>, or <code>HMethod</code>, respectively. 23 cananian 1.1.2.12 * In all other cases, <code>value</code> will contain 24 cananian 1.1.2.1 * an object of the specified type; values of primitive types will use 25 cananian 1.1.2.1 * the standard wrapper class. An example may clarify: 26 cananian 1.1.2.1 * <UL> 27 cananian 1.1.2.1 * <LI>The integer constant 0 is represented by <BR> 28 cananian 1.1.2.8 * <CODE>new CONST(qf, hce, dst, new Integer(0), HClass.Int);</code> 29 cananian 1.1.2.1 * <LI>The string constant "hello, world" is represented by <BR> 30 cananian 1.1.2.8 * <CODE>new CONST(qf, hce, dst, "hello, world", 31 cananian 1.1.2.12 * linker.forName("java.lang.String") );</code> 32 cananian 1.1.2.12 * <LI>The class constant that would be returned by 33 cananian 1.1.2.12 * <code>Class.forName("java.lang.Object")</code> is represented by <BR> 34 cananian 1.1.2.12 * <CODE>new CONST(qf, hce, dst, linker.forName("java.lang.Object"), 35 cananian 1.1.2.12 * linker.forName("java.lang.Class") );</code> 36 cananian 1.1.2.1 * <LI>The null literal is represented by <BR> 37 cananian 1.1.2.8 * <CODE>new CONST(qf, hce, dst, null, HClass.Void);</code> 38 cananian 1.1.2.1 * </UL> 39 cananian 1.1.2.1 * 40 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 41 cananian 1.5 * @version $Id: CONST.java,v 1.5 2002/04/11 04:00:34 cananian Exp $ 42 cananian 1.1.2.1 */ 43 cananian 1.1.2.1 44 cananian 1.1.2.1 public class CONST extends Quad { 45 cananian 1.1.2.2 /** The destination <code>Temp</code>. */ 46 cananian 1.1.2.2 protected Temp dst; 47 cananian 1.1.2.2 /** An object representing the constant value. */ 48 cananian 1.1.2.2 final protected Object value; 49 cananian 1.1.2.2 /** The type of the constant value. */ 50 cananian 1.1.2.2 final protected HClass type; 51 cananian 1.1.2.2 52 cananian 1.1.2.1 /** Creates a <code>CONST</code> from a destination temporary, and object 53 cananian 1.1.2.2 * value and its class type. 54 cananian 1.1.2.2 * @param dst 55 cananian 1.1.2.2 * the <code>Temp</code> which will contain the specified 56 cananian 1.1.2.2 * constant value. 57 cananian 1.1.2.2 * @param value 58 cananian 1.1.2.2 * an object representing the constant value. 59 cananian 1.1.2.2 * @param type 60 cananian 1.1.2.2 * the type of the constant value. 61 cananian 1.1.2.2 */ 62 cananian 1.1.2.4 public CONST(QuadFactory qf, HCodeElement source, 63 cananian 1.1.2.1 Temp dst, Object value, HClass type) { 64 cananian 1.1.2.4 super(qf, source); 65 cananian 1.1.2.1 this.dst = dst; 66 cananian 1.1.2.1 this.value = value; 67 cananian 1.1.2.1 this.type = type; 68 cananian 1.1.2.2 // VERIFY legality of this CONST. 69 cananian 1.3.2.1 assert dst!=null && type!=null; 70 cananian 1.3.2.1 assert type.equals(HClass.Int) || type.equals(HClass.Long) || 71 cananian 1.1.2.2 type.equals(HClass.Float) || type.equals(HClass.Double) || 72 cananian 1.1.2.2 type.equals(HClass.Void) || 73 cananian 1.1.2.12 type.getName().equals("java.lang.Class") || 74 cananian 1.1.2.12 type.getName().equals("java.lang.reflect.Field") || 75 cananian 1.1.2.12 type.getName().equals("java.lang.reflect.Method") || 76 cananian 1.3.2.1 type.getName().equals("java.lang.String"); 77 cananian 1.1.2.2 if (type.equals(HClass.Void)) 78 cananian 1.3.2.1 assert value==null; 79 cananian 1.1.2.2 else 80 cananian 1.3.2.1 assert value!=null; 81 cananian 1.1.2.1 } 82 cananian 1.1.2.2 // ACCESSOR METHODS: 83 cananian 1.1.2.2 /** Returns the <code>Temp</code> which will contain the specified 84 cananian 1.1.2.2 * constant value. */ 85 cananian 1.1.2.2 public Temp dst() { return dst; } 86 cananian 1.1.2.2 /** Returns the object representing the constant value. */ 87 cananian 1.1.2.2 public Object value() { return value; } 88 cananian 1.1.2.2 /** Returns the type of the constant value. */ 89 cananian 1.1.2.2 public HClass type() { return type; } 90 cananian 1.1.2.1 91 cananian 1.1.2.1 /** Returns the Temp defined by this Quad. 92 cananian 1.1.2.2 * @return the <code>dst</code> field. */ 93 cananian 1.1.2.1 public Temp[] def() { return new Temp[] { dst }; } 94 cananian 1.1.2.1 95 cananian 1.1.2.3 public int kind() { return QuadKind.CONST; } 96 cananian 1.1.2.3 97 cananian 1.1.2.6 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 98 cananian 1.1.2.6 return new CONST(qqf, this, map(defMap,dst), value, type); 99 cananian 1.1.2.3 } 100 cananian 1.1.2.6 /** Rename all used variables in this Quad according to a mapping. 101 cananian 1.1.2.6 * @deprecated does not preserve immutability. */ 102 cananian 1.1.2.3 void renameUses(TempMap tm) { 103 cananian 1.1.2.1 } 104 cananian 1.1.2.6 /** Rename all defined variables in this Quad according to a mapping. 105 cananian 1.1.2.6 * @deprecated does not preserve immutability. */ 106 cananian 1.1.2.3 void renameDefs(TempMap tm) { 107 cananian 1.1.2.1 dst = tm.tempMap(dst); 108 cananian 1.1.2.1 } 109 cananian 1.1.2.1 110 cananian 1.1.2.10 public void accept(QuadVisitor v) { v.visit(this); } 111 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 112 cananian 1.1.2.1 113 cananian 1.1.2.1 /** Returns a human-readable representation of this Quad. */ 114 cananian 1.1.2.1 public String toString() { 115 cananian 1.1.2.1 StringBuffer sb = new StringBuffer(dst.toString()); 116 cananian 1.1.2.1 sb.append(" = CONST "); 117 cananian 1.1.2.11 if (type.getName().equals("java.lang.String")) 118 cananian 1.1.2.1 sb.append("(String)\""+Util.escape(value.toString())+"\""); 119 cananian 1.1.2.2 else if (type.equals(HClass.Void) && value == null) 120 cananian 1.1.2.1 sb.append("null"); 121 cananian 1.1.2.1 else 122 cananian 1.1.2.1 sb.append("("+type.getName()+")"+value.toString()); 123 cananian 1.1.2.1 return sb.toString(); 124 cananian 1.1.2.1 } 125 cananian 1.2 }