00001 package edu.ksu.cis.bandera.specification.assertion;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import ca.mcgill.sable.soot.*;
00036 import ca.mcgill.sable.soot.jimple.*;
00037 import edu.ksu.cis.bandera.jjjc.*;
00038 import edu.ksu.cis.bandera.annotation.*;
00039 import edu.ksu.cis.bandera.pdgslicer.datastructure.*;
00040 import java.util.*;
00041
00042 public class AssertionSliceInterestCollector {
00043 private static Jimple jimple = Jimple.v();
00044
00045
00046
00047
00048
00049
00050 public static Collection collect(Collection result)
00051 {
00052 SootMethod assertMethod;
00053 try
00054 {
00055 assertMethod = CompilationManager.getSootClassManager().getClass("Bandera").getMethod("assert");
00056 } catch (Exception e)
00057 {
00058 throw new RuntimeException(e.getMessage());
00059 }
00060 for (Enumeration e = CompilationManager.getCompiledClasses().elements(); e.hasMoreElements();)
00061 {
00062 SootClass sc = (SootClass) e.nextElement();
00063 if (!Modifier.isInterface(sc.getModifiers()))
00064 {
00065 for (ca.mcgill.sable.util.Iterator i = sc.getMethods().iterator(); i.hasNext();)
00066 {
00067 SootMethod sm = (SootMethod) i.next();
00068 JimpleBody body = (JimpleBody) sm.getBody(jimple);
00069 Object[] stmts = body.getStmtList().toArray();
00070 for (int j = 0; j < stmts.length; j++)
00071 {
00072 if (stmts[j] instanceof InvokeStmt)
00073 {
00074 Value value = ((InvokeStmt) stmts[j]).getInvokeExpr();
00075 if (value instanceof StaticInvokeExpr)
00076 {
00077 StaticInvokeExpr staticInvokeExpr = (StaticInvokeExpr) value;
00078 if (staticInvokeExpr.getMethod() == assertMethod)
00079 {
00080 result.add(new SliceLocal(sc, sm, (Local) staticInvokeExpr.getArg(0)));
00081 int sind = SlicePoint.getStmtIndex(sm, (Stmt) stmts[j]);
00082 result.add(new SlicePoint(sc, sm, (Stmt) stmts[j], sind));
00083 }
00084 }
00085 }
00086 }
00087 }
00088 }
00089 }
00090 return result;
00091 }
00092 }