1
2
3
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 }