1 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 phaseName) { 50 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 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 paramName = assertStatusClass.getName(); 118 String 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 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 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 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 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 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 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 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 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 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 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 |