1 kkz 1.1.2.1 // EventDriven.java, created Fri Nov 12 14:03:59 1999 by kkz 2 cananian 1.1.2.13 // 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.EventDriven; 5 kkz 1.1.2.1 6 kkz 1.1.2.1 import harpoon.Analysis.ClassHierarchy; 7 bdemsky 1.1.2.7 import harpoon.Analysis.Quads.CallGraph; 8 bdemsky 1.1.2.9 9 bdemsky 1.1.2.9 import harpoon.Analysis.MetaMethods.MetaCallGraph; 10 bdemsky 1.1.2.9 11 cananian 1.1.2.6 import harpoon.ClassFile.CachingCodeFactory; 12 bdemsky 1.1.2.9 import harpoon.ClassFile.HCodeFactory; 13 kkz 1.1.2.1 import harpoon.ClassFile.HCode; 14 bdemsky 1.1.2.4 import harpoon.ClassFile.HClass; 15 kkz 1.1.2.1 import harpoon.ClassFile.HMethod; 16 bdemsky 1.1.2.5 import harpoon.ClassFile.Linker; 17 kkz 1.1.2.1 import harpoon.IR.Quads.METHOD; 18 bdemsky 1.1.2.2 import harpoon.IR.Quads.HEADER; 19 kkz 1.1.2.1 import harpoon.IR.Quads.Quad; 20 bdemsky 1.1.2.7 import harpoon.IR.Quads.QuadSSI; 21 kkz 1.1.2.1 import harpoon.Temp.Temp; 22 kkz 1.1.2.1 23 bdemsky 1.1.2.12 24 bdemsky 1.1.2.4 import java.util.HashMap; 25 kkz 1.1.2.1 import java.util.Iterator; 26 bdemsky 1.1.2.4 import java.util.Map; 27 bdemsky 1.1.2.11 import java.util.Set; 28 cananian 1.3 import net.cscott.jutil.WorkSet; 29 kkz 1.1.2.1 /** 30 kkz 1.1.2.1 * <code>EventDriven</code> 31 kkz 1.1.2.1 * 32 cananian 1.1.2.13 * @author Karen K. Zee <kkz@alum.mit.edu> 33 cananian 1.3 * @version $Id: EventDriven.java,v 1.3 2004/02/08 01:51:58 cananian Exp $ 34 kkz 1.1.2.1 */ 35 kkz 1.1.2.1 public class EventDriven { 36 cananian 1.1.2.6 protected final CachingCodeFactory ucf; 37 kkz 1.1.2.1 protected final HCode hc; 38 kkz 1.1.2.1 protected final ClassHierarchy ch; 39 bdemsky 1.1.2.4 protected Map classmap; 40 bdemsky 1.1.2.5 protected final Linker linker; 41 bdemsky 1.1.2.8 protected boolean optimistic; 42 bdemsky 1.1.2.10 protected boolean recycle; 43 bdemsky 1.1.2.11 protected Set classes; 44 bdemsky 1.1.2.4 45 cananian 1.1.2.6 /** Creates a <code>EventDriven</code>. The <code>CachingCodeFactory</code> 46 bdemsky 1.1.2.7 * needs to have been created from a <code>QuadSSI</code> that contains 47 kkz 1.1.2.1 * type information. 48 kkz 1.1.2.1 * 49 kkz 1.1.2.1 * <code>HCode</code> needs to be the <code>HCode</code> for main. 50 kkz 1.1.2.1 */ 51 bdemsky 1.1.2.10 public EventDriven(CachingCodeFactory ucf, HCode hc, ClassHierarchy ch, Linker linker, boolean optimistic, boolean recycle) { 52 kkz 1.1.2.1 this.ucf = ucf; 53 kkz 1.1.2.1 this.hc = hc; 54 kkz 1.1.2.1 this.ch = ch; 55 bdemsky 1.1.2.5 this.linker=linker; 56 bdemsky 1.1.2.8 this.optimistic=optimistic; 57 bdemsky 1.1.2.10 this.recycle=recycle; 58 bdemsky 1.1.2.11 this.classes=new WorkSet(); 59 bdemsky 1.1.2.11 } 60 bdemsky 1.1.2.11 61 bdemsky 1.1.2.11 public Set classes() { 62 bdemsky 1.1.2.11 return classes; 63 kkz 1.1.2.1 } 64 kkz 1.1.2.1 65 kkz 1.1.2.1 /** Returns the converted main 66 kkz 1.1.2.1 */ 67 bdemsky 1.1.2.9 public HMethod convert(MetaCallGraph mcg) { 68 kkz 1.1.2.1 // Clone the class that main was in, and replace it 69 bdemsky 1.1.2.8 HMethod oldmain=hc.getMethod(); 70 bdemsky 1.1.2.5 HClass origClass = oldmain.getDeclaringClass(); 71 bdemsky 1.1.2.5 72 bdemsky 1.1.2.5 73 bdemsky 1.1.2.7 // CallGraph cg=new CallGraph(ch, ucf); 74 bdemsky 1.1.2.7 // WorkSet todo=new WorkSet(); 75 bdemsky 1.1.2.7 // WorkSet done=new WorkSet(); 76 bdemsky 1.1.2.7 // todo.add(hc.getMethod()); 77 bdemsky 1.1.2.7 // while(!todo.isEmpty()) { 78 bdemsky 1.1.2.7 // HMethod hm=(HMethod)todo.pop(); 79 bdemsky 1.1.2.7 // done.add(hm); 80 bdemsky 1.1.2.7 // System.out.println(hm); 81 bdemsky 1.1.2.7 // System.out.println("-------------------------------------"); 82 bdemsky 1.1.2.7 // HMethod[] hma=cg.calls(hm); 83 bdemsky 1.1.2.7 // for (int i=0;i<hma.length;i++) { 84 bdemsky 1.1.2.7 // System.out.println("calls "+hma[i]); 85 bdemsky 1.1.2.7 // if (!done.contains(hma[i])) 86 bdemsky 1.1.2.7 // todo.add(hma[i]); 87 bdemsky 1.1.2.7 // } 88 bdemsky 1.1.2.7 // } 89 bdemsky 1.1.2.7 90 bdemsky 1.1.2.11 ToAsync as = new ToAsync(ucf,hc ,ch ,linker,optimistic,mcg,recycle,classes); 91 kkz 1.1.2.1 // transform main to mainAsync 92 kkz 1.1.2.1 HMethod newmain = as.transform(); 93 kkz 1.1.2.1 94 kkz 1.1.2.1 if (newmain == null) System.err.println("EventDriven.convert(): " + 95 kkz 1.1.2.1 "newmain is null"); 96 kkz 1.1.2.1 97 kkz 1.1.2.1 Temp[] params = null; 98 bdemsky 1.1.2.11 HEADER header=(HEADER) (hc.getRootElement()); 99 bdemsky 1.1.2.2 METHOD method=(METHOD) (header.next(1)); 100 bdemsky 1.1.2.2 params=method.params(); 101 bdemsky 1.1.2.12 //NO ALLOCATION IN HERE 102 bdemsky 1.1.2.7 ucf.put(oldmain, new EventDrivenCode(oldmain, newmain, params, linker)); 103 bdemsky 1.1.2.5 return oldmain; 104 kkz 1.1.2.1 } 105 kkz 1.1.2.1 } 106 bdemsky 1.1.2.12 107 bdemsky 1.1.2.12 108 bdemsky 1.1.2.12 109 bdemsky 1.1.2.7 110 bdemsky 1.1.2.7 111 bdemsky 1.1.2.5 112 cananian 1.2