00001 package edu.ksu.cis.bandera.annotation;
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.jimple.*;
00036 import java.util.*;
00037 public class Statements {
00038 public final static int REMAINED = 0;
00039 public final static int SLICED = 1;
00040 public final static int MODIFIED = 2;
00041 private Vector statements = new Vector();
00042 private BitSet removedStatements = null;
00043 private BitSet modifiedStatements = null;
00044
00045
00046
00047
00048 public void add(Stmt stmt) {
00049 statements.addElement(stmt);
00050 }
00051
00052
00053
00054
00055
00056 public boolean contains(Stmt stmt) {
00057 return statements.contains(stmt);
00058 }
00059
00060
00061
00062
00063 public Enumeration elements() {
00064 return statements.elements();
00065 }
00066
00067
00068
00069
00070
00071 public int getAnnotationState() {
00072 if (removedStatements != null) {
00073 if (edu.ksu.cis.bandera.pdgslicer.SetUtil.emptyBitSetWithLength(removedStatements, getNumOfStatements()))
00074 return SLICED;
00075 else
00076 return MODIFIED;
00077 } else
00078 if (modifiedStatements != null)
00079 return MODIFIED;
00080 return REMAINED;
00081 }
00082
00083
00084
00085
00086 public int getNumOfStatements() {
00087 return statements.size();
00088 }
00089
00090
00091
00092
00093
00094 public Stmt getStmtAt(int index) {
00095 return (Stmt) statements.elementAt(index);
00096 }
00097
00098
00099
00100
00101
00102 public int indexOf(Stmt stmt) {
00103 return statements.indexOf(stmt);
00104 }
00105
00106
00107
00108
00109 public void initializeState() {
00110 removedStatements = null;
00111 modifiedStatements = null;
00112 }
00113
00114
00115
00116
00117
00118 public void insertStmtAt(Stmt stmt, int index) {
00119 statements.insertElementAt(stmt, index);
00120 }
00121
00122
00123
00124
00125
00126 public boolean remove(Stmt stmt) {
00127 return statements.removeElement(stmt);
00128 }
00129
00130
00131
00132
00133
00134 public boolean removeByMark(Stmt stmt) {
00135 if (statements.contains(stmt)) {
00136 if (removedStatements == null) {
00137 removedStatements = new BitSet(getNumOfStatements());
00138 edu.ksu.cis.bandera.pdgslicer.SetUtil.initializeBitSetToAllTrue(removedStatements);
00139 }
00140 removedStatements.clear(indexOf(stmt));
00141 return true;
00142 }
00143 return false;
00144 }
00145
00146
00147
00148
00149
00150
00151 public boolean replace(Stmt oldStmt, Stmt newStmt) {
00152 int i = statements.indexOf(oldStmt);
00153 if (i >= 0) {
00154 statements.setElementAt(newStmt, i);
00155 return true;
00156 } else return false;
00157 }
00158
00159
00160
00161
00162
00163
00164 public boolean replaceByMark(Stmt oldStmt, Stmt newStmt) {
00165 int i = statements.indexOf(oldStmt);
00166 if (i >= 0) {
00167 if (modifiedStatements == null) {
00168 modifiedStatements = new BitSet(getNumOfStatements());
00169 edu.ksu.cis.bandera.pdgslicer.SetUtil.initializeBitSetToAllFalse(modifiedStatements);
00170 }
00171 modifiedStatements.set(i);
00172 return true;
00173 } else
00174 return false;
00175 }
00176
00177
00178
00179
00180 public Stmt[] toArray() {
00181 Stmt[] result = new Stmt[statements.size()];
00182
00183 for (int i = 0; i < result.length; i++) result[i] = (Stmt) statements.elementAt(i);
00184
00185 return result;
00186 }
00187
00188
00189
00190
00191 public String toString() {
00192 return statements.toString();
00193 }
00194
00195
00196
00197
00198 public void validate(JimpleBody body) {
00199 StmtList stmtList = body.getStmtList();
00200
00201 Vector newStatements = new Vector();
00202
00203 for (Enumeration e = elements(); e.hasMoreElements();) {
00204 Stmt stmt = (Stmt) e.nextElement();
00205 if (stmtList.contains(stmt)) newStatements.addElement(stmt);
00206 }
00207
00208 statements = newStatements;
00209 }
00210 }