1 kkz      1.1.2.1 // EnvCode.java, created Sat Oct 30 20:25:43 1999 by kkz
  2 cananian 1.1.2.8 // Copyright (C) 1999 Karen K. Zee <kkz@alum.mit.edu>
  3 kkz      1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 kkz      1.1.2.1 package harpoon.Analysis.EnvBuilder;
  5 kkz      1.1.2.1 
  6 kkz      1.1.2.1 import harpoon.ClassFile.HCode;
  7 cananian 1.1.2.7 import harpoon.ClassFile.HCodeAndMaps;
  8 kkz      1.1.2.1 import harpoon.ClassFile.HField;
  9 kkz      1.1.2.1 import harpoon.ClassFile.HMethod;
 10 bdemsky  1.1.2.6 import harpoon.ClassFile.HClass;
 11 bdemsky  1.1.2.6 import harpoon.ClassFile.Linker;
 12 kkz      1.1.2.1 import harpoon.IR.Quads.Code;
 13 kkz      1.1.2.1 import harpoon.IR.Quads.FOOTER;
 14 kkz      1.1.2.1 import harpoon.IR.Quads.HEADER;
 15 kkz      1.1.2.1 import harpoon.IR.Quads.METHOD;
 16 kkz      1.1.2.1 import harpoon.IR.Quads.RETURN;
 17 kkz      1.1.2.1 import harpoon.IR.Quads.SET;
 18 bdemsky  1.1.2.6 import harpoon.IR.Quads.THROW;
 19 bdemsky  1.1.2.6 import harpoon.IR.Quads.PHI;
 20 bdemsky  1.1.2.6 import harpoon.IR.Quads.CALL;
 21 kkz      1.1.2.1 import harpoon.IR.Quads.Quad;
 22 kkz      1.1.2.1 import harpoon.Temp.Temp;
 23 kkz      1.1.2.1 import harpoon.Temp.TempFactory;
 24 kkz      1.1.2.1 import harpoon.Util.Util;
 25 kkz      1.1.2.1 
 26 kkz      1.1.2.1 /**
 27 kkz      1.1.2.1  * <code>EnvCode</code>
 28 kkz      1.1.2.1  * 
 29 cananian 1.1.2.8  * @author Karen K. Zee <kkz@alum.mit.edu>
 30 cananian 1.3      * @version $Id: EnvCode.java,v 1.3 2003/03/11 18:22:09 cananian Exp $
 31 kkz      1.1.2.1  */
 32 bdemsky  1.1.2.5 public class EnvCode extends harpoon.IR.Quads.QuadSSI {
 33 kkz      1.1.2.1 
 34 kkz      1.1.2.1     /** Creates a <code>EnvCode</code>. */
 35 bdemsky  1.1.2.6     public EnvCode(HMethod parent, HField[] fields, Linker linker) {
 36 kkz      1.1.2.1         super(parent, null);
 37 bdemsky  1.1.2.6         this.quads = buildCode(fields,linker);
 38 kkz      1.1.2.1     }
 39 kkz      1.1.2.1 
 40 kkz      1.1.2.1     private EnvCode(HMethod parent) {
 41 kkz      1.1.2.1         super(parent, null);
 42 kkz      1.1.2.1     }
 43 kkz      1.1.2.1 
 44 kkz      1.1.2.1     /** Clone this code representation.  The clone has its own copy of
 45 kkz      1.1.2.1      *  the quad graph. 
 46 kkz      1.1.2.1      */
 47 cananian 1.3         public HCodeAndMaps<Quad> clone(HMethod newMethod) {
 48 cananian 1.1.2.7         return cloneHelper(new EnvCode(newMethod));
 49 kkz      1.1.2.1     }
 50 kkz      1.1.2.1 
 51 kkz      1.1.2.1     /**
 52 kkz      1.1.2.1      * Return the name of this code view.
 53 kkz      1.1.2.1      * @return the name of the <code>parent</code>'s code view.
 54 kkz      1.1.2.1      */
 55 kkz      1.1.2.1     public String getName() {
 56 bdemsky  1.1.2.5         return harpoon.IR.Quads.QuadSSI.codename;
 57 kkz      1.1.2.1     }
 58 kkz      1.1.2.1 
 59 bdemsky  1.1.2.6     private Quad buildCode(HField[] fields, Linker linker) {
 60 kkz      1.1.2.2         System.out.println("Entering EnvCode.buildCode()");
 61 bdemsky  1.1.2.5         HEADER h = new HEADER(qf, null);
 62 bdemsky  1.1.2.6         FOOTER f = new FOOTER(qf, null,((linker!=null)?3:2));
 63 kkz      1.1.2.1         Quad.addEdge(h, 0, f, 0);
 64 kkz      1.1.2.1 
 65 bdemsky  1.1.2.5         TempFactory tf = qf.tempFactory();
 66 kkz      1.1.2.1 
 67 kkz      1.1.2.1         Temp[] params = new Temp[fields.length+1];
 68 bdemsky  1.1.2.6         Temp[][] dst = new Temp[fields.length+1][2];
 69 bdemsky  1.1.2.6         
 70 kkz      1.1.2.1         for (int i=0; i<params.length; i++) {
 71 kkz      1.1.2.1             params[i] = new Temp(tf);
 72 bdemsky  1.1.2.6             if (linker!=null) {
 73 bdemsky  1.1.2.6                 dst[i][0]=new Temp(tf);
 74 bdemsky  1.1.2.6                 dst[i][1]=new Temp(tf);
 75 bdemsky  1.1.2.6             }
 76 bdemsky  1.1.2.6             else dst[i][0]=params[i];
 77 kkz      1.1.2.1         }
 78 kkz      1.1.2.1 
 79 bdemsky  1.1.2.6         Quad m = new METHOD(qf, null, params, 1);
 80 kkz      1.1.2.1         Quad.addEdge(h, 1, m, 0);
 81 bdemsky  1.1.2.6         Temp retex=new Temp(tf);
 82 kkz      1.1.2.1 
 83 bdemsky  1.1.2.6         if (linker!=null) {
 84 bdemsky  1.1.2.6             CALL c =new CALL(qf,null,linker.forName("java.lang.Object").getConstructor(new HClass[0]), 
 85 bdemsky  1.1.2.6                              new Temp[] {params[0]},null,retex,false,false,dst,params);
 86 bdemsky  1.1.2.6             THROW th=new THROW(qf,null,retex);
 87 bdemsky  1.1.2.6             Quad.addEdge(m,0,c,0);
 88 bdemsky  1.1.2.6             
 89 bdemsky  1.1.2.6             Quad.addEdge(c,1,th,0);
 90 bdemsky  1.1.2.6             Quad.addEdge(th,0,f,2);
 91 bdemsky  1.1.2.6             m=c;
 92 bdemsky  1.1.2.6         }
 93 bdemsky  1.1.2.6 
 94 bdemsky  1.1.2.6         Temp objectref = dst[0][0];
 95 kkz      1.1.2.1 
 96 kkz      1.1.2.1         Quad[] quadList = new Quad[fields.length];
 97 kkz      1.1.2.1         for (int i=0; i < fields.length; i++) {
 98 kkz      1.1.2.1             quadList[i] = 
 99 bdemsky  1.1.2.6                 new SET(qf, null, fields[i], objectref, dst[i+1][0]);
100 kkz      1.1.2.1         }
101 bdemsky  1.1.2.4         if (fields.length>0) {
102 bdemsky  1.1.2.4             Quad.addEdges(quadList);
103 bdemsky  1.1.2.4             Quad.addEdge(m, 0, quadList[0], 0);
104 bdemsky  1.1.2.4         }
105 kkz      1.1.2.1 
106 bdemsky  1.1.2.5         RETURN r = new RETURN(qf, null, null);
107 bdemsky  1.1.2.4         if (fields.length>0) {
108 bdemsky  1.1.2.4             Quad.addEdge(quadList[fields.length-1], 0, r, 0);
109 bdemsky  1.1.2.4         } else
110 bdemsky  1.1.2.4             Quad.addEdge(m, 0, r, 0);
111 bdemsky  1.1.2.4         
112 kkz      1.1.2.1         Quad.addEdge(r, 0, f, 1);
113 kkz      1.1.2.1 
114 kkz      1.1.2.2         System.out.println("Leaving EnvCode.buildCode()");
115 kkz      1.1.2.1         return h;
116 kkz      1.1.2.1     }
117 cananian 1.2     }