00001 package edu.ksu.cis.bandera.jjjc.decompiler;
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 ca.mcgill.sable.util.*;
00038 import java.util.*;
00039 import ca.mcgill.sable.util.Iterator;
00040 import ca.mcgill.sable.util.LinkedList;
00041
00042
00043
00044
00045
00046
00047
00048
00049 public class DecompilerStmtSwitch implements StmtSwitch {
00050 private static DecompilerStmtSwitch walker = new DecompilerStmtSwitch();
00051 private Vector result = new Vector();
00052
00053
00054
00055 public DecompilerStmtSwitch()
00056 {
00057 result = new Vector();
00058 }
00059
00060
00061
00062 public void caseAssignStmt(AssignStmt stmt)
00063 {
00064 Value leftOp = stmt.getLeftOp();
00065 Value rightOp = stmt.getRightOp();
00066 boolean isBool = DecompilerInfo.isBool(leftOp) || leftOp.getType().toString().trim().equals("boolean");
00067 String rightValue = rightOp.toString().trim();
00068
00069 if (DecompilerInfo.qvDef(leftOp) == 0)
00070 {
00071 result.add(leftOp.getType().toString());
00072 result.add(" ");
00073 }
00074
00075 DecompilerInfo.putVarInfo(leftOp,rightOp);
00076 result.addAll(DecompilerValueSwitch.evaluate(leftOp));
00077 DecompilerValueSwitch.reset();
00078 result.add(" ");
00079 result.add("=");
00080 result.add(" ");
00081 if (isBool)
00082 {
00083 if (rightValue.equals("0")) result.add("false");
00084 else if (rightValue.equals("1")) result.add("true");
00085 else result.addAll(DecompilerValueSwitch.evaluate(rightOp));
00086 } else
00087 result.addAll(DecompilerValueSwitch.evaluate(rightOp));
00088 DecompilerValueSwitch.reset();
00089 }
00090
00091
00092
00093 public void caseBreakpointStmt(BreakpointStmt stmt)
00094 {
00095
00096 }
00097
00098
00099
00100 public void caseEnterMonitorStmt(EnterMonitorStmt stmt)
00101 {
00102 result.add("synchronized");
00103 result.add(" ");
00104 result.add("(");
00105 result.addAll(DecompilerValueSwitch.evaluate(stmt.getOp()));
00106 DecompilerValueSwitch.reset();
00107 result.add(")");
00108 }
00109
00110
00111
00112 public void caseExitMonitorStmt(ExitMonitorStmt stmt)
00113 {
00114
00115
00116 }
00117
00118
00119
00120 public void caseGotoStmt(GotoStmt stmt) {
00121 result.add(DecompilerUtil.gotoStr);
00122 result.add(" ");
00123 result.add(DecompilerGotoMapper.mapStmt((Stmt) stmt.getTarget()));
00124 }
00125
00126
00127
00128 public void caseIdentityStmt(IdentityStmt stmt)
00129 {
00130 result.addAll(DecompilerValueSwitch.evaluate(stmt.getLeftOp()));
00131 DecompilerValueSwitch.reset();
00132 result.add(" ");
00133 result.add(":=");
00134 result.add(" ");
00135 result.addAll(DecompilerValueSwitch.evaluate(stmt.getRightOp()));
00136 DecompilerValueSwitch.reset();
00137 }
00138
00139
00140
00141 public void caseIfStmt(IfStmt stmt)
00142 {
00143 result.add("if");
00144 result.add(" ");
00145 result.add("(");
00146 result.addAll(DecompilerValueSwitch.evaluate(stmt.getCondition()));
00147 DecompilerValueSwitch.reset();
00148 result.add(")");
00149 result.add(" ");
00150 result.add(DecompilerUtil.gotoStr);
00151 result.add(" ");
00152 result.add(DecompilerGotoMapper.mapStmt(stmt.getTarget()));
00153 }
00154
00155
00156
00157 public void caseInvokeStmt(InvokeStmt stmt)
00158 {
00159 result.addAll(DecompilerValueSwitch.evaluate(stmt.getInvokeExpr()));
00160 DecompilerValueSwitch.reset();
00161 }
00162
00163
00164
00165 public void caseLookupSwitchStmt(LookupSwitchStmt stmt)
00166 {
00167 result.add("switch");
00168 result.add(" ");
00169 result.add("(");
00170 result.addAll(DecompilerValueSwitch.evaluate(stmt.getKey()));
00171 result.add(")");
00172 DecompilerValueSwitch.reset();
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 }
00198
00199
00200
00201 public void caseNopStmt(NopStmt stmt)
00202 {
00203
00204
00205 }
00206
00207
00208
00209 public void caseRetStmt(RetStmt stmt)
00210 {
00211
00212 }
00213
00214
00215
00216 public void caseReturnStmt(ReturnStmt stmt)
00217 {
00218 result.add("return");
00219 result.add(" ");
00220 result.addAll(DecompilerValueSwitch.evaluate(stmt.getReturnValue()));
00221 DecompilerValueSwitch.reset();
00222 }
00223
00224
00225
00226 public void caseReturnVoidStmt(ReturnVoidStmt stmt)
00227 {
00228 result.add("return");
00229 }
00230
00231
00232
00233 public void caseTableSwitchStmt(TableSwitchStmt stmt)
00234 {
00235
00236 }
00237
00238
00239
00240 public void caseThrowStmt(ThrowStmt stmt)
00241 {
00242 result.add("throw");
00243 result.add(" ");
00244 result.addAll(DecompilerValueSwitch.evaluate(stmt.getOp()));
00245 DecompilerValueSwitch.reset();
00246 }
00247
00248
00249
00250 public void defaultCase(Object obj)
00251 {
00252
00253 }
00254 public static Vector evaluate(Stmt stmt)
00255 {
00256 if (stmt==null) return new Vector();
00257 stmt.apply(walker);
00258 return walker.getResult();
00259 }
00260 private Vector getResult()
00261 {
00262 return result;
00263 }
00264 public static void reset()
00265 {
00266 walker.result = new Vector();
00267 }
00268 }