KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > soot > javaToJimple > PolyglotMethodSource


1 /* Soot - a J*va Optimization Framework
2  * Copyright (C) 2004 Jennifer Lhotak
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */

19
20 package soot.javaToJimple;
21
22 import java.util.*;
23 import soot.*;
24
25 public class PolyglotMethodSource implements MethodSource {
26
27     private polyglot.ast.Block block;
28     private List formals;
29     private ArrayList fieldInits;
30     private ArrayList staticFieldInits;
31     private ArrayList initializerBlocks;
32     private ArrayList staticInitializerBlocks;
33     private soot.Local outerClassThisInit;
34     private boolean hasAssert = false;
35     private ArrayList finalsList;
36     private HashMap newToOuterMap;
37     private AbstractJimpleBodyBuilder ajbb;
38     
39     public PolyglotMethodSource(){
40         this.block = null;
41         this.formals = null;
42     }
43     
44     public PolyglotMethodSource(polyglot.ast.Block block, List formals){
45         this.block = block;
46         this.formals = formals;
47     }
48
49     public soot.Body getBody(soot.SootMethod sm, String JavaDoc phaseName) {
50         //JimpleBodyBuilder jbb = new JimpleBodyBuilder();
51
soot.jimple.JimpleBody jb = ajbb.createJimpleBody(block, formals, sm);
52        
53         PackManager.v().getPack("jj").apply(jb);
54         return jb;
55     }
56
57     public void setJBB(AbstractJimpleBodyBuilder ajbb){
58         this.ajbb = ajbb;
59     }
60
61     public void setFieldInits(ArrayList fieldInits){
62         this.fieldInits = fieldInits;
63     }
64     
65     public void setStaticFieldInits(ArrayList staticFieldInits){
66         this.staticFieldInits = staticFieldInits;
67     }
68
69     public ArrayList getFieldInits() {
70         return fieldInits;
71     }
72     
73     public ArrayList getStaticFieldInits() {
74         return staticFieldInits;
75     }
76
77     public void setStaticInitializerBlocks(ArrayList staticInits) {
78         staticInitializerBlocks = staticInits;
79     }
80     
81     public void setInitializerBlocks(ArrayList inits) {
82         initializerBlocks = inits;
83     }
84
85     public ArrayList getStaticInitializerBlocks() {
86         return staticInitializerBlocks;
87     }
88     
89     public ArrayList getInitializerBlocks() {
90         return initializerBlocks;
91     }
92     
93     public void setOuterClassThisInit(soot.Local l) {
94         outerClassThisInit = l;
95     }
96
97     public soot.Local getOuterClassThisInit(){
98         return outerClassThisInit;
99     }
100
101     public boolean hasAssert(){
102         return hasAssert;
103     }
104
105     public void hasAssert(boolean val){
106         hasAssert = val;
107     }
108
109     public void addAssertInits(soot.Body body){
110         // if class is inner get desired assertion status from outer most class
111
soot.SootClass assertStatusClass = body.getMethod().getDeclaringClass();
112         HashMap innerMap = soot.javaToJimple.InitialResolver.v().getInnerClassInfoMap();
113         while ((innerMap != null) && (innerMap.containsKey(assertStatusClass))){
114             assertStatusClass = ((InnerClassInfo)innerMap.get(assertStatusClass)).getOuterClass();
115         }
116
117         String JavaDoc paramName = assertStatusClass.getName();
118         String JavaDoc fieldName = "class$"+soot.util.StringTools.replaceAll(assertStatusClass.getName(), ".", "$");
119         
120         if (assertStatusClass.isInterface()){
121             assertStatusClass = (soot.SootClass)InitialResolver.v().specialAnonMap().get(assertStatusClass);
122         }
123         
124         // field ref
125
soot.SootFieldRef field = soot.Scene.v().makeFieldRef(assertStatusClass, fieldName, soot.RefType.v("java.lang.Class"), true);
126
127         soot.Local fieldLocal = soot.jimple.Jimple.v().newLocal("$r0", soot.RefType.v("java.lang.Class"));
128
129         body.getLocals().add(fieldLocal);
130         
131         soot.jimple.FieldRef fieldRef = soot.jimple.Jimple.v().newStaticFieldRef(field);
132         
133         soot.jimple.AssignStmt fieldAssignStmt = soot.jimple.Jimple.v().newAssignStmt(fieldLocal, fieldRef);
134
135         body.getUnits().add(fieldAssignStmt);
136
137         // if field not null
138
soot.jimple.ConditionExpr cond = soot.jimple.Jimple.v().newNeExpr(fieldLocal, soot.jimple.NullConstant.v());
139         
140         soot.jimple.NopStmt nop1 = soot.jimple.Jimple.v().newNopStmt();
141
142         soot.jimple.IfStmt ifStmt = soot.jimple.Jimple.v().newIfStmt(cond, nop1);
143         body.getUnits().add(ifStmt);
144
145         // if alternative
146
soot.Local invokeLocal = soot.jimple.Jimple.v().newLocal("$r1", soot.RefType.v("java.lang.Class"));
147
148         body.getLocals().add(invokeLocal);
149         
150         ArrayList paramTypes = new ArrayList();
151         paramTypes.add(soot.RefType.v("java.lang.String"));
152                 
153         soot.SootMethodRef methodToInvoke = soot.Scene.v().makeMethodRef(assertStatusClass, "class$", paramTypes, soot.RefType.v("java.lang.Class"), true);
154
155         ArrayList params = new ArrayList();
156         params.add(soot.jimple.StringConstant.v(paramName));
157         soot.jimple.StaticInvokeExpr invoke = soot.jimple.Jimple.v().newStaticInvokeExpr(methodToInvoke, params);
158         soot.jimple.AssignStmt invokeAssign = soot.jimple.Jimple.v().newAssignStmt(invokeLocal, invoke);
159         
160         body.getUnits().add(invokeAssign);
161
162         // field ref assign
163
soot.jimple.AssignStmt fieldRefAssign = soot.jimple.Jimple.v().newAssignStmt(fieldRef, invokeLocal);
164
165         body.getUnits().add(fieldRefAssign);
166
167         soot.jimple.NopStmt nop2 = soot.jimple.Jimple.v().newNopStmt();
168
169         soot.jimple.GotoStmt goto1 = soot.jimple.Jimple.v().newGotoStmt(nop2);
170
171         body.getUnits().add(goto1);
172         // add nop1 - and if consequence
173
body.getUnits().add(nop1);
174
175         soot.jimple.AssignStmt fieldRefAssign2 = soot.jimple.Jimple.v().newAssignStmt(invokeLocal, fieldRef);
176
177         body.getUnits().add(fieldRefAssign2);
178
179         body.getUnits().add(nop2);
180
181         // boolean tests
182
soot.Local boolLocal1 = soot.jimple.Jimple.v().newLocal("$z0", soot.BooleanType.v());
183         body.getLocals().add(boolLocal1);
184         soot.Local boolLocal2 = soot.jimple.Jimple.v().newLocal("$z1", soot.BooleanType.v());
185         body.getLocals().add(boolLocal2);
186
187         // virtual invoke
188
soot.SootMethodRef vMethodToInvoke = Scene.v().makeMethodRef(soot.Scene.v().getSootClass("java.lang.Class"), "desiredAssertionStatus", new ArrayList(), soot.BooleanType.v(), false);
189         soot.jimple.VirtualInvokeExpr vInvoke = soot.jimple.Jimple.v().newVirtualInvokeExpr(invokeLocal, vMethodToInvoke, new ArrayList());
190
191         
192         soot.jimple.AssignStmt testAssign = soot.jimple.Jimple.v().newAssignStmt(boolLocal1, vInvoke);
193
194         body.getUnits().add(testAssign);
195         
196         // if
197
soot.jimple.ConditionExpr cond2 = soot.jimple.Jimple.v().newNeExpr(boolLocal1, soot.jimple.IntConstant.v(0));
198
199         soot.jimple.NopStmt nop3 = soot.jimple.Jimple.v().newNopStmt();
200         
201         soot.jimple.IfStmt ifStmt2 = soot.jimple.Jimple.v().newIfStmt(cond2, nop3);
202         body.getUnits().add(ifStmt2);
203
204         // alternative
205
soot.jimple.AssignStmt altAssign = soot.jimple.Jimple.v().newAssignStmt(boolLocal2, soot.jimple.IntConstant.v(1));
206
207         body.getUnits().add(altAssign);
208
209         soot.jimple.NopStmt nop4 = soot.jimple.Jimple.v().newNopStmt();
210
211         soot.jimple.GotoStmt goto2 = soot.jimple.Jimple.v().newGotoStmt(nop4);
212
213         body.getUnits().add(goto2);
214
215         body.getUnits().add(nop3);
216         
217         soot.jimple.AssignStmt conAssign = soot.jimple.Jimple.v().newAssignStmt(boolLocal2, soot.jimple.IntConstant.v(0));
218
219         body.getUnits().add(conAssign);
220
221         body.getUnits().add(nop4);
222         
223         // field assign
224
soot.SootFieldRef fieldD = Scene.v().makeFieldRef(body.getMethod().getDeclaringClass(), "$assertionsDisabled", soot.BooleanType.v(), true);
225
226         soot.jimple.FieldRef fieldRefD = soot.jimple.Jimple.v().newStaticFieldRef(fieldD);
227         soot.jimple.AssignStmt fAssign = soot.jimple.Jimple.v().newAssignStmt(fieldRefD, boolLocal2);
228         body.getUnits().add(fAssign);
229         
230     }
231
232     public void setFinalsList(ArrayList list){
233         finalsList = list;
234     }
235
236     public ArrayList getFinalsList(){
237         return finalsList;
238     }
239
240     public void setNewToOuterMap(HashMap map){
241         newToOuterMap = map;
242     }
243
244     public HashMap getNewToOuterMap(){
245         return newToOuterMap;
246     }
247 }
248
Popular Tags