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