00001 package edu.ksu.cis.bandera.birc;
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.io.*;
00036 import java.util.*;
00037
00038 import edu.ksu.cis.bandera.jext.*;
00039
00040 import ca.mcgill.sable.util.*;
00041 import ca.mcgill.sable.soot.*;
00042 import ca.mcgill.sable.soot.jimple.*;
00043
00044 public class ObservableExtractor extends AbstractBanderaValueSwitch
00045 {
00046 Hashtable observableSet;
00047
00048 public ObservableExtractor(Hashtable observableSet) {
00049 this.observableSet = observableSet;
00050 }
00051 public void caseAddExpr(AddExpr expr) {
00052 expr.getOp1().apply(this);
00053 expr.getOp2().apply(this);
00054 }
00055 public void caseArrayRef(ArrayRef expr) {
00056 expr.getBase().apply(this);
00057 expr.getIndex().apply(this);
00058 }
00059 public void caseCastExpr(CastExpr expr) {
00060 expr.getOp().apply(this);
00061 }
00062 public void caseChooseExpr(ChooseExpr expr) {
00063 }
00064 public void caseComplementExpr(ComplementExpr expr) {
00065 expr.getOp().apply(this);
00066 }
00067 public void caseDivExpr(DivExpr expr) {
00068 expr.getOp1().apply(this);
00069 expr.getOp2().apply(this);
00070 }
00071 public void caseEqExpr(EqExpr expr)
00072 {
00073 expr.getOp1().apply(this);
00074 expr.getOp2().apply(this);
00075 }
00076 public void caseGeExpr(GeExpr expr) {
00077 expr.getOp1().apply(this);
00078 expr.getOp2().apply(this);
00079 }
00080 public void caseGtExpr(GtExpr expr) {
00081 expr.getOp1().apply(this);
00082 expr.getOp2().apply(this);
00083 }
00084 public void caseInExpr(InExpr expr) {
00085 expr.getOp1().apply(this);
00086 }
00087 public void caseInstanceFieldRef(InstanceFieldRef expr) {
00088 expr.getBase().apply(this);
00089 SootField field = expr.getField();
00090 observableSet.put(field,field);
00091 }
00092 public void caseInstanceOfExpr(InstanceOfExpr expr) {
00093 expr.getOp().apply(this);
00094 }
00095 public void caseIntConstant(IntConstant expr) {
00096 }
00097 public void caseLeExpr(LeExpr expr) {
00098 expr.getOp1().apply(this);
00099 expr.getOp2().apply(this);
00100 }
00101 public void caseLengthExpr(LengthExpr expr) {
00102 expr.getOp().apply(this);
00103 }
00104 public void caseLocalExpr(LocalExpr expr) {
00105 SootMethod method = expr.getMethod();
00106 Local local = expr.getLocal();
00107 String key = ExprExtractor.localKey(method,local);
00108 observableSet.put(key,key);
00109 }
00110 public void caseLocationTestExpr(LocationTestExpr expr) {
00111 Vector stmts = expr.getStmts();
00112 for (int i = 0; i < stmts.size(); i++)
00113 observableSet.put(stmts.elementAt(i),stmts);
00114 }
00115 public void caseLogicalAndExpr(LogicalAndExpr expr) {
00116 expr.getOp1().apply(this);
00117 expr.getOp2().apply(this);
00118 }
00119 public void caseLogicalOrExpr(LogicalOrExpr expr) {
00120 expr.getOp1().apply(this);
00121 expr.getOp2().apply(this);
00122 }
00123 public void caseLtExpr(LtExpr expr) {
00124 expr.getOp1().apply(this);
00125 expr.getOp2().apply(this);
00126 }
00127 public void caseMulExpr(MulExpr expr) {
00128 expr.getOp1().apply(this);
00129 expr.getOp2().apply(this);
00130 }
00131 public void caseNeExpr(NeExpr expr)
00132 {
00133 expr.getOp1().apply(this);
00134 expr.getOp2().apply(this);
00135 }
00136 public void caseNegExpr(NegExpr expr) {
00137 expr.getOp().apply(this);
00138 }
00139 public void caseNewArrayExpr(NewArrayExpr expr) {
00140 }
00141 public void caseNewExpr(NewExpr expr) {
00142 }
00143 public void caseNullConstant(NullConstant expr) {
00144 }
00145 public void caseRemExpr(RemExpr expr) {
00146 expr.getOp1().apply(this);
00147 expr.getOp2().apply(this);
00148 }
00149 public void caseStaticFieldRef(StaticFieldRef expr) {
00150 SootField field = expr.getField();
00151 observableSet.put(field,field);
00152 }
00153 public void caseStaticInvokeExpr(StaticInvokeExpr expr) {
00154 throw new RuntimeException("Unhandled static method call: " + expr);
00155 }
00156 public void caseStringConstant(StringConstant expr) {
00157 }
00158 public void caseSubExpr(SubExpr expr) {
00159 expr.getOp1().apply(this);
00160 expr.getOp2().apply(this);
00161 }
00162 public void defaultCase(Object o) {
00163 throw new RuntimeException("Unhandled expression type: " + o);
00164 }
00165 }