View Javadoc

1   // Helper.java, created Thu Jan 16 10:53:32 2003 by mcmartin
2   // Copyright (C) 2001-3 mcmartin
3   // Licensed under the terms of the GNU LGPL; see COPYING for details.
4   package joeq.Main;
5   
6   import java.util.Iterator;
7   import java.util.LinkedList;
8   import java.util.List;
9   import java.io.BufferedReader;
10  import java.io.File;
11  import java.io.FileReader;
12  import java.io.IOException;
13  import joeq.Class.PrimordialClassLoader;
14  import joeq.Class.jq_Class;
15  import joeq.Class.jq_Method;
16  import joeq.Class.jq_MethodVisitor;
17  import joeq.Class.jq_Type;
18  import joeq.Class.jq_TypeVisitor;
19  import joeq.Compiler.Quad.BasicBlock;
20  import joeq.Compiler.Quad.BasicBlockVisitor;
21  import joeq.Compiler.Quad.ControlFlowGraph;
22  import joeq.Compiler.Quad.ControlFlowGraphVisitor;
23  import joeq.Compiler.Quad.Quad;
24  import joeq.Compiler.Quad.QuadVisitor;
25  
26  /***
27   * @author  Michael Martin <mcmartin@stanford.edu>
28   * @version $Id: Helper.java 1816 2004-06-29 21:06:39Z mcmartin $
29   */
30  public class Helper {
31      static {
32          HostedVM.initialize();
33      }
34  
35      public static jq_Type load(String classname) {
36          try {
37              jq_Type c = jq_Type.parseType(classname);
38              c.load();
39              c.prepare();
40              return c;
41          } catch (NoClassDefFoundError e) {
42              System.err.println("Could not find class " + classname
43                  + ", skipping.");
44          }
45          return null;
46      }
47  
48      public static jq_Type[] loadPackage(String packagename) {
49          return loadPackages(packagename, false);
50      }
51  
52      public static jq_Type[] loadPackages(String packagename) {
53          return loadPackages(packagename, true);
54      }
55  
56      public static jq_Type[] loadPackages(String packagename, boolean recursive) {
57          String canonicalPackageName = packagename.replace('.', '/');
58          if (!canonicalPackageName.equals("")
59              && !canonicalPackageName.endsWith("/")) canonicalPackageName += '/';
60          Iterator i = joeq.Class.PrimordialClassLoader.loader.listPackage(
61              canonicalPackageName, recursive);
62          if (!i.hasNext()) {
63              System.err.println("Package " + canonicalPackageName
64                  + " not found.");
65          }
66          LinkedList ll = new LinkedList();
67          while (i.hasNext()) {
68              String c = (String) i.next();
69              c = c.substring(0, c.length() - 6);
70              jq_Type t = Helper.load(c);
71              if (t != null) ll.add(t);
72          }
73          return (jq_Class[]) ll.toArray(new jq_Class[0]);
74      }
75  
76      /***
77       * Add paths contained in file fileName. 
78       *  @param fileName -- name of the file with class paths
79       * */
80      public static void addToClassPath(String fileName) {
81          try {
82              BufferedReader br = new BufferedReader(new FileReader(fileName));
83              for (;;) {
84                  String s = br.readLine();
85                  if (s == null) break;
86                  if (s.length() == 0) continue;
87                  if (s.startsWith("%")) continue;
88                  if (s.startsWith("#")) continue;
89                  PrimordialClassLoader.loader.addToClasspath(s);
90              }
91              br.close();
92          } catch (IOException e) {
93              e.printStackTrace();
94              System.exit(2);
95          }
96      }
97  
98      public static void addJarDir(String dir) {
99          List jars = new LinkedList();
100 
101         addJarDir_aux(new File(dir), jars);
102 
103         for (Iterator i = jars.iterator(); i.hasNext();) {
104             PrimordialClassLoader.loader.addToClasspath(i.next().toString());
105         }
106     }
107 
108     static private void addJarDir_aux(File f, List results) {
109         if (f.getPath().endsWith(".jar")) {
110             results.add(f.getPath());
111         } else if (f.list() != null) {
112             String[] contents=f.list();
113             for (int i = 0; i<contents.length; i++) {
114                 addJarDir_aux(new File(f.getPath(), contents[i]), results);
115             }
116         }
117     }
118 
119     
120     public static void runPass(jq_Class c, jq_TypeVisitor tv) {
121         c.accept(tv);
122     }
123 
124     public static void runPass(jq_Class c, jq_MethodVisitor mv) {
125         runPass(c, new jq_MethodVisitor.DeclaredMethodVisitor(mv));
126     }
127 
128     public static void runPass(jq_Class c, ControlFlowGraphVisitor cfgv) {
129         runPass(c, new ControlFlowGraphVisitor.CodeCacheVisitor(cfgv));
130     }
131 
132     public static void runPass(jq_Class c, BasicBlockVisitor bbv) {
133         runPass(c, new BasicBlockVisitor.AllBasicBlockVisitor(bbv));
134     }
135 
136     public static void runPass(jq_Class c, QuadVisitor qv) {
137         runPass(c, new QuadVisitor.AllQuadVisitor(qv));
138     }
139 
140     public static void runPass(jq_Method m, jq_MethodVisitor mv) {
141         m.accept(mv);
142     }
143 
144     public static void runPass(jq_Method m, ControlFlowGraphVisitor cfgv) {
145         runPass(m, new ControlFlowGraphVisitor.CodeCacheVisitor(cfgv));
146     }
147 
148     public static void runPass(jq_Method m, BasicBlockVisitor bbv) {
149         runPass(m, new BasicBlockVisitor.AllBasicBlockVisitor(bbv));
150     }
151 
152     public static void runPass(jq_Method m, QuadVisitor qv) {
153         runPass(m, new QuadVisitor.AllQuadVisitor(qv));
154     }
155 
156     public static void runPass(ControlFlowGraph c, ControlFlowGraphVisitor cfgv) {
157         cfgv.visitCFG(c);
158     }
159 
160     public static void runPass(ControlFlowGraph c, BasicBlockVisitor bbv) {
161         runPass(c, new BasicBlockVisitor.AllBasicBlockVisitor(bbv));
162     }
163 
164     public static void runPass(ControlFlowGraph c, QuadVisitor qv) {
165         runPass(c, new QuadVisitor.AllQuadVisitor(qv));
166     }
167 
168     public static void runPass(BasicBlock b, BasicBlockVisitor bbv) {
169         bbv.visitBasicBlock(b);
170     }
171 
172     public static void runPass(BasicBlock b, QuadVisitor qv) {
173         runPass(b, new QuadVisitor.AllQuadVisitor(qv));
174     }
175 
176     public static void runPass(Quad q, QuadVisitor qv) {
177         q.accept(qv);
178     }
179 }