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 }