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      }