1 cananian 1.1.2.1 // NEW.java, created Wed Aug 5 07:08:20 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.1 import java.lang.reflect.Modifier; 7 cananian 1.1.2.1 8 cananian 1.1.2.6 import harpoon.ClassFile.HClass; 9 cananian 1.1.2.6 import harpoon.ClassFile.HCodeElement; 10 cananian 1.1.2.1 import harpoon.Temp.Temp; 11 cananian 1.1.2.1 import harpoon.Temp.TempMap; 12 cananian 1.1.2.1 import harpoon.Util.Util; 13 cananian 1.1.2.2 14 cananian 1.1.2.1 /** 15 cananian 1.1.2.1 * <code>NEW</code> represents an object creation operation. 16 cananian 1.1.2.8 * It creates an <b>uninitialized</b> instance of an object. One of the 17 cananian 1.1.2.8 * object's constructors must then be called (using a non-virtual 18 cananian 1.1.2.8 * <code>Quads.CALL</code>) to complete the instantiation. 19 cananian 1.1.2.1 * 20 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 21 cananian 1.5 * @version $Id: NEW.java,v 1.5 2002/04/11 04:00:34 cananian Exp $ 22 cananian 1.1.2.1 */ 23 cananian 1.1.2.1 public class NEW extends Quad { 24 cananian 1.1.2.2 /** The <code>Temp</code> in which to store the new object. */ 25 cananian 1.1.2.2 protected Temp dst; 26 cananian 1.1.2.1 /** Description of the class to create. */ 27 cananian 1.1.2.2 final protected HClass hclass; 28 cananian 1.1.2.2 29 cananian 1.1.2.1 /** Creates a <code>NEW</code> object. <code>NEW</code> creates 30 cananian 1.1.2.2 * a new instance of the class <code>hclass</code>. 31 cananian 1.1.2.2 * @param dst 32 cananian 1.1.2.2 * the <code>Temp</code> in which to store the new object. 33 cananian 1.1.2.2 * @param hclass 34 cananian 1.1.2.2 * the class to create. 35 cananian 1.1.2.2 */ 36 cananian 1.1.2.4 public NEW(QuadFactory qf, HCodeElement source, 37 cananian 1.1.2.1 Temp dst, HClass hclass) { 38 cananian 1.1.2.4 super(qf, source); 39 cananian 1.1.2.1 this.dst = dst; 40 cananian 1.1.2.1 this.hclass = hclass; 41 cananian 1.1.2.2 // VERIFY legality of NEW 42 cananian 1.3.2.1 assert dst!=null && hclass!=null; 43 cananian 1.1.2.1 // from JVM spec: 44 cananian 1.3.2.1 assert !hclass.isArray() && !hclass.isInterface(); 45 cananian 1.3.2.1 assert !hclass.isPrimitive(); 46 cananian 1.3.2.1 assert !Modifier.isAbstract(hclass.getModifiers()); 47 cananian 1.1.2.1 } 48 cananian 1.1.2.2 /** Returns the <code>Temp</code> in which to store the new object. */ 49 cananian 1.1.2.2 public Temp dst() { return dst; } 50 cananian 1.1.2.2 /** Returns the class this <code>NEW</code> will create. */ 51 cananian 1.1.2.2 public HClass hclass() { return hclass; } 52 cananian 1.1.2.1 53 cananian 1.1.2.2 /** Returns the <code>Temp</code> defined by this <code>Quad</code>. 54 cananian 1.1.2.1 * @return the <code>dst</code> field. */ 55 cananian 1.1.2.1 public Temp[] def() { return new Temp[] { dst }; } 56 cananian 1.1.2.1 57 cananian 1.1.2.3 public int kind() { return QuadKind.NEW; } 58 cananian 1.1.2.3 59 cananian 1.1.2.5 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 60 cananian 1.1.2.5 return new NEW(qqf, this, map(defMap,dst), hclass); 61 cananian 1.1.2.3 } 62 cananian 1.1.2.5 /** Rename all used variables in this Quad according to a mapping. 63 cananian 1.1.2.5 * @deprecated does not preserve immutability. */ 64 cananian 1.1.2.3 void renameUses(TempMap tm) { 65 cananian 1.1.2.1 } 66 cananian 1.1.2.5 /** Rename all defined variables in this Quad according to a mapping. 67 cananian 1.1.2.5 * @deprecated does not preserve immutability. */ 68 cananian 1.1.2.3 void renameDefs(TempMap tm) { 69 cananian 1.1.2.1 dst = tm.tempMap(dst); 70 cananian 1.1.2.1 } 71 cananian 1.1.2.1 72 cananian 1.1.2.7 public void accept(QuadVisitor v) { v.visit(this); } 73 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 74 cananian 1.1.2.1 75 cananian 1.1.2.1 /** Returns a human-readable representation of this quad. */ 76 cananian 1.1.2.1 public String toString() { 77 cananian 1.1.2.1 return dst.toString() + " = NEW " + hclass.getName(); 78 cananian 1.1.2.1 } 79 cananian 1.2 }