1 19 20 package soot.dava.toolkits.base.AST.transformations; 21 22 import soot.*; 23 import java.util.*; 24 import soot.dava.internal.SET.*; 25 import soot.dava.internal.AST.*; 26 27 public class UselessLabeledBlockRemover { 28 29 public static void removeLabeledBlock(ASTNode node, ASTLabeledBlockNode labelBlock, int subBodyNumber, int nodeNumber){ 30 if(!(node instanceof ASTIfElseNode)){ 31 List subBodies = node.get_SubBodies(); 33 if(subBodies.size()!=1){ 34 throw new RuntimeException ("Please report this benchmark to the programmer"); 36 } 37 List onlySubBody = (List)subBodies.get(0); 38 39 43 List newBody = createNewSubBody(onlySubBody,nodeNumber,labelBlock); 44 if(newBody==null){ 45 return; 47 } 48 if(node instanceof ASTMethodNode){ 49 ((ASTMethodNode)node).replaceBody(newBody); 50 G.v().ASTTransformations_modified = true; 51 } 53 else if(node instanceof ASTSynchronizedBlockNode){ 54 ((ASTSynchronizedBlockNode)node).replaceBody(newBody); 55 G.v().ASTTransformations_modified = true; 56 } 58 else if(node instanceof ASTLabeledBlockNode){ 59 ((ASTLabeledBlockNode)node).replaceBody(newBody); 60 G.v().ASTTransformations_modified = true; 61 } 63 else if(node instanceof ASTUnconditionalLoopNode){ 64 ((ASTUnconditionalLoopNode)node).replaceBody(newBody); 65 G.v().ASTTransformations_modified = true; 66 } 68 else if(node instanceof ASTIfNode){ 69 ((ASTIfNode)node).replaceBody(newBody); 70 G.v().ASTTransformations_modified = true; 71 } 73 else if(node instanceof ASTWhileNode){ 74 ((ASTWhileNode)node).replaceBody(newBody); 75 G.v().ASTTransformations_modified = true; 76 } 78 else if(node instanceof ASTDoWhileNode){ 79 ((ASTDoWhileNode)node).replaceBody(newBody); 80 G.v().ASTTransformations_modified = true; 81 } 83 else { 84 return; 86 } 87 } 88 else{ if(subBodyNumber!=0 && subBodyNumber!=1){ 91 return; 94 } 95 List subBodies = node.get_SubBodies(); 96 if(subBodies.size()!=2){ 97 throw new RuntimeException ("Please report this benchmark to the programmer"); 99 } 100 101 List toModifySubBody = (List)subBodies.get(subBodyNumber); 102 103 107 List newBody = createNewSubBody(toModifySubBody,nodeNumber,labelBlock); 108 if(newBody==null){ 109 return; 111 } 112 if(subBodyNumber==0){ 113 G.v().ASTTransformations_modified = true; 116 ((ASTIfElseNode)node).replaceBody(newBody,(List)subBodies.get(1)); 117 } 118 else if(subBodyNumber==1){ 119 G.v().ASTTransformations_modified = true; 122 ((ASTIfElseNode)node).replaceBody((List)subBodies.get(0),newBody); 123 } 124 else{ return; 128 } 129 130 } } 132 133 134 135 136 137 public static List createNewSubBody(List oldSubBody,int nodeNumber,ASTLabeledBlockNode labelBlock){ 138 List newSubBody = new ArrayList(); 140 141 Iterator it = oldSubBody.iterator(); 143 144 int index=0; 146 while(index!=nodeNumber ){ 147 if(!it.hasNext()){ 148 return null; 149 } 150 newSubBody.add(it.next()); 151 index++; 152 } 153 154 ASTNode toRemove = (ASTNode)it.next(); 157 if(!(toRemove instanceof ASTLabeledBlockNode)){ 158 return null; 160 } 161 else{ 162 ASTLabeledBlockNode toRemoveNode = (ASTLabeledBlockNode)toRemove; 163 164 SETNodeLabel label = toRemoveNode.get_Label(); 166 if(label.toString()!=null){ 167 return null; 169 } 170 171 List blocksSubBodies = toRemoveNode.get_SubBodies(); 174 List onlySubBodyOfLabeledBlock = (List)blocksSubBodies.get(0); 176 177 newSubBody.addAll(onlySubBodyOfLabeledBlock); 179 } 180 181 while(it.hasNext()){ 183 newSubBody.add(it.next()); 184 } 185 186 return newSubBody; 188 } 189 } | Popular Tags |