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