1 19 20 package soot.javaToJimple; 21 22 import java.util.*; 23 24 import soot.SootMethodRef; 25 public class AssertClassMethodSource implements soot.MethodSource { 26 27 public soot.Body getBody(soot.SootMethod sootMethod, String phaseName){ 28 29 soot.Body classBody = soot.jimple.Jimple.v().newBody(sootMethod); 30 31 soot.jimple.ParameterRef paramRef = soot.jimple.Jimple.v().newParameterRef(soot.RefType.v("java.lang.String"), 0); 33 34 35 soot.Local paramLocal = soot.jimple.Jimple.v().newLocal("$r0", soot.RefType.v("java.lang.String")); 36 classBody.getLocals().add(paramLocal); 37 soot.jimple.Stmt stmt = soot.jimple.Jimple.v().newIdentityStmt(paramLocal, paramRef); 38 classBody.getUnits().add(stmt); 39 40 ArrayList paramTypes = new ArrayList(); 41 paramTypes.add(soot.RefType.v("java.lang.String")); 42 soot.SootMethodRef methodToInvoke = soot.Scene.v().makeMethodRef( soot.Scene.v().getSootClass("java.lang.Class"), "forName", paramTypes, soot.RefType.v("java.lang.Class"), true); 43 soot.Local invokeLocal = soot.jimple.Jimple.v().newLocal("$r1", soot.RefType.v("java.lang.Class")); 44 classBody.getLocals().add(invokeLocal); 45 ArrayList params = new ArrayList(); 46 params.add(paramLocal); 47 soot.jimple.Expr invokeExpr = soot.jimple.Jimple.v().newStaticInvokeExpr(methodToInvoke, params); 48 soot.jimple.Stmt assign = soot.jimple.Jimple.v().newAssignStmt(invokeLocal, invokeExpr); 49 classBody.getUnits().add(assign); 50 51 soot.jimple.Stmt retStmt = soot.jimple.Jimple.v().newReturnStmt(invokeLocal); 53 classBody.getUnits().add(retStmt); 54 55 soot.Local catchRefLocal = soot.jimple.Jimple.v().newLocal("$r2", soot.RefType.v("java.lang.ClassNotFoundException")); 57 classBody.getLocals().add(catchRefLocal); 58 soot.jimple.CaughtExceptionRef caughtRef = soot.jimple.Jimple.v().newCaughtExceptionRef(); 59 soot.jimple.Stmt caughtIdentity = soot.jimple.Jimple.v().newIdentityStmt(catchRefLocal, caughtRef); 60 classBody.getUnits().add(caughtIdentity); 61 62 soot.Local noClassDefLocal = soot.jimple.Jimple.v().newLocal("$r3", soot.RefType.v("java.lang.NoClassDefFoundError")); 64 classBody.getLocals().add(noClassDefLocal); 65 soot.jimple.Expr newExpr = soot.jimple.Jimple.v().newNewExpr(soot.RefType.v("java.lang.NoClassDefFoundError")); 66 soot.jimple.Stmt noClassDefAssign = soot.jimple.Jimple.v().newAssignStmt(noClassDefLocal, newExpr); 67 classBody.getUnits().add(noClassDefAssign); 68 69 paramTypes = new ArrayList(); 71 soot.SootMethodRef initMethToInvoke = soot.Scene.v().makeMethodRef( soot.Scene.v().getSootClass("java.lang.NoClassDefFoundError"), "<init>", paramTypes, soot.VoidType.v(), false); 72 params = new ArrayList(); 73 soot.jimple.Expr initInvoke = soot.jimple.Jimple.v().newSpecialInvokeExpr(noClassDefLocal, initMethToInvoke, params); 74 soot.jimple.Stmt initStmt = soot.jimple.Jimple.v().newInvokeStmt(initInvoke); 75 classBody.getUnits().add(initStmt); 76 77 soot.Local throwLocal = soot.jimple.Jimple.v().newLocal("$r4", soot.RefType.v("java.lang.Throwable")); 79 classBody.getLocals().add(throwLocal); 80 paramTypes = new ArrayList(); 81 paramTypes.add(soot.RefType.v("java.lang.Throwable")); 82 params = new ArrayList(); 83 params.add(catchRefLocal); 84 soot.SootMethodRef messageMethToInvoke = soot.Scene.v().makeMethodRef( soot.Scene.v().getSootClass("java.lang.Throwable"), "initCause", paramTypes, soot.RefType.v("java.lang.Throwable"), false); 85 86 soot.jimple.Expr messageInvoke = soot.jimple.Jimple.v().newVirtualInvokeExpr(noClassDefLocal, messageMethToInvoke, params); 87 soot.jimple.Stmt messageAssign = soot.jimple.Jimple.v().newAssignStmt(throwLocal, messageInvoke); 88 classBody.getUnits().add(messageAssign); 89 90 soot.jimple.Stmt throwStmt = soot.jimple.Jimple.v().newThrowStmt(throwLocal); 92 throwStmt.addTag(new soot.tagkit.ThrowCreatedByCompilerTag()); 93 classBody.getUnits().add(throwStmt); 94 95 soot.Trap trap = soot.jimple.Jimple.v().newTrap(soot.Scene.v().getSootClass("java.lang.ClassNotFoundException"), assign, retStmt, caughtIdentity); 97 classBody.getTraps().add(trap); 98 99 100 return classBody; 101 102 } 103 } 104
| Popular Tags
|