KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > soot > javaToJimple > ClassLiteralMethodSource


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
24 import soot.SootMethodRef;
25 public class ClassLiteralMethodSource implements soot.MethodSource {
26
27     public soot.Body getBody(soot.SootMethod sootMethod, String JavaDoc phaseName){
28             
29         soot.Body classBody = soot.jimple.Jimple.v().newBody(sootMethod);
30
31         // static invoke of forName
32
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         // return
52
soot.jimple.Stmt retStmt = soot.jimple.Jimple.v().newReturnStmt(invokeLocal);
53         classBody.getUnits().add(retStmt);
54
55         // catch
56
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         // new no class def found error
63
soot.Local throwLocal = soot.jimple.Jimple.v().newLocal("$r3", soot.RefType.v("java.lang.NoClassDefFoundError"));
64         classBody.getLocals().add(throwLocal);
65         soot.jimple.Expr newExpr = soot.jimple.Jimple.v().newNewExpr(soot.RefType.v("java.lang.NoClassDefFoundError"));
66         soot.jimple.Stmt throwAssign = soot.jimple.Jimple.v().newAssignStmt(throwLocal, newExpr);
67         classBody.getUnits().add(throwAssign);
68
69         // get exception message
70
soot.Local messageLocal = soot.jimple.Jimple.v().newLocal("$r4", soot.RefType.v("java.lang.String"));
71         classBody.getLocals().add(messageLocal);
72         //params = new ArrayList();
73
//params.add(catchRefLocal);
74
soot.SootMethodRef messageMethToInvoke = soot.Scene.v().makeMethodRef( soot.Scene.v().getSootClass("java.lang.Throwable"), "getMessage", new ArrayList(), soot.RefType.v("java.lang.String"), false);
75
76         soot.jimple.Expr messageInvoke = soot.jimple.Jimple.v().newVirtualInvokeExpr(catchRefLocal, messageMethToInvoke, new ArrayList());
77         soot.jimple.Stmt messageAssign = soot.jimple.Jimple.v().newAssignStmt(messageLocal, messageInvoke);
78         classBody.getUnits().add(messageAssign);
79
80         // no class def found init
81
paramTypes = new ArrayList();
82         paramTypes.add(soot.RefType.v("java.lang.String"));
83         soot.SootMethodRef initMethToInvoke = soot.Scene.v().makeMethodRef( soot.Scene.v().getSootClass("java.lang.NoClassDefFoundError"), "<init>", paramTypes, soot.VoidType.v(), false);
84         params = new ArrayList();
85         params.add(messageLocal);
86         soot.jimple.Expr initInvoke = soot.jimple.Jimple.v().newSpecialInvokeExpr(throwLocal, initMethToInvoke, params);
87         soot.jimple.Stmt initStmt = soot.jimple.Jimple.v().newInvokeStmt(initInvoke);
88         classBody.getUnits().add(initStmt);
89             
90         // throw
91
soot.jimple.Stmt throwStmt = soot.jimple.Jimple.v().newThrowStmt(throwLocal);
92         throwStmt.addTag(new soot.tagkit.ThrowCreatedByCompilerTag());
93         classBody.getUnits().add(throwStmt);
94         
95         // trap
96
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