00001 package edu.ksu.cis.bandera.prog;
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 java.util.Vector;
00036 import ca.mcgill.sable.soot.*;
00037 import ca.mcgill.sable.soot.jimple.*;
00038 import ca.mcgill.sable.util.*;
00039 import edu.ksu.cis.bandera.jext.*;
00040 public class AbstractionChooseFixer implements StmtSwitch {
00041 private static AbstractionChooseFixer fixer = new AbstractionChooseFixer();
00042 private static Jimple jimple = Jimple.v();
00043
00044
00045
00046 private AbstractionChooseFixer() {
00047 }
00048
00049
00050
00051 public void caseAssignStmt(AssignStmt stmt) {
00052 Value rightOp = stmt.getRightOp();
00053 if (rightOp instanceof StaticInvokeExpr) {
00054 StaticInvokeExpr sie = (StaticInvokeExpr) rightOp;
00055 SootMethod sm = sie.getMethod();
00056 if ("edu.ksu.cis.bandera.abstraction.Abstraction".equals(sm.getDeclaringClass().getName())
00057 && "choose".equals(sm.getName().trim())) {
00058 int argCount = sie.getArgCount();
00059 Vector args = new Vector();
00060 if (argCount == 0) {
00061 args.add(IntConstant.v(0));
00062 args.add(IntConstant.v(1));
00063 } else if (argCount == 1) {
00064 int constant = ((IntConstant) sie.getArg(0)).value;
00065 if (constant == 0) {
00066 System.out.println("*** Error: Choose with zero value ***");
00067 return;
00068 }
00069 int val = 0;
00070 do {
00071 if ((constant & 1) == 1) {
00072 args.add(IntConstant.v(val));
00073 }
00074 val++;
00075 constant >>= 1;
00076 } while (constant != 0);
00077 } else {
00078 throw new RuntimeException("AbstractionChooseFixer class is not updated!!!");
00079 }
00080 stmt.setRightOp(new ChooseExpr(args));
00081 }
00082 }
00083 }
00084
00085
00086
00087 public void caseBreakpointStmt(BreakpointStmt stmt) {}
00088
00089
00090
00091 public void caseEnterMonitorStmt(EnterMonitorStmt stmt) {}
00092
00093
00094
00095 public void caseExitMonitorStmt(ExitMonitorStmt stmt) {}
00096
00097
00098
00099 public void caseGotoStmt(GotoStmt stmt) {}
00100
00101
00102
00103 public void caseIdentityStmt(IdentityStmt stmt) {}
00104
00105
00106
00107 public void caseIfStmt(IfStmt stmt) {}
00108
00109
00110
00111 public void caseInvokeStmt(InvokeStmt stmt) {}
00112
00113
00114
00115 public void caseLookupSwitchStmt(LookupSwitchStmt stmt) {}
00116
00117
00118
00119 public void caseNopStmt(NopStmt stmt) {}
00120
00121
00122
00123 public void caseRetStmt(RetStmt stmt) {}
00124
00125
00126
00127 public void caseReturnStmt(ReturnStmt stmt) {}
00128
00129
00130
00131 public void caseReturnVoidStmt(ReturnVoidStmt stmt) {}
00132
00133
00134
00135 public void caseTableSwitchStmt(TableSwitchStmt stmt) {}
00136
00137
00138
00139 public void caseThrowStmt(ThrowStmt stmt) {}
00140
00141
00142
00143 public void defaultCase(Object obj) {}
00144
00145
00146
00147
00148 public static void fix(Stmt s) {
00149 s.apply(fixer);
00150 }
00151
00152
00153
00154
00155 public static void fix(SootClass sc) {
00156 for (Iterator i = sc.getMethods().iterator(); i.hasNext(); ) {
00157 fix((SootMethod) i.next());
00158 }
00159 }
00160
00161
00162
00163
00164 public static void fix(SootMethod sm) {
00165 for (Iterator i = ((JimpleBody) sm.getBody(jimple)).getStmtList().iterator(); i.hasNext();) {
00166 fix((Stmt) i.next());
00167 }
00168 }
00169 }