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     }