1 19 20 package jode.flow; 21 import jode.decompiler.TabbedPrintWriter; 22 import jode.decompiler.LocalInfo; 23 import jode.expr.LocalStoreOperator; 24 import jode.expr.StoreInstruction; 25 import jode.util.SimpleSet; 26 27 import java.util.Set ; 28 29 34 public class SequentialBlock extends StructuredBlock { 35 StructuredBlock[] subBlocks; 36 37 public SequentialBlock() { 38 subBlocks = new StructuredBlock[2]; 39 } 40 41 public void setFirst(StructuredBlock sb) { 42 subBlocks[0] = sb; 43 sb.outer = this; 44 sb.setFlowBlock(flowBlock); 45 } 46 47 public void setSecond(StructuredBlock sb) { 48 subBlocks[1] = sb; 49 sb.outer = this; 50 sb.setFlowBlock(flowBlock); 51 } 52 53 public void checkConsistent() { 54 super.checkConsistent(); 55 if (subBlocks[0].jump != null 56 || subBlocks[0] instanceof SequentialBlock 57 || jump != null) 58 throw new jode.AssertError("Inconsistency"); 59 } 60 61 67 public VariableStack mapStackToLocal(VariableStack stack) { 68 if (stack == null) 69 jode.GlobalOptions.err.println("map stack to local called with null: " + this+ " in "+this.flowBlock); 70 VariableStack middle = subBlocks[0].mapStackToLocal(stack); 71 if (middle != null) 72 return subBlocks[1].mapStackToLocal(middle); 74 jode.GlobalOptions.err.println("Dead code after Block " + subBlocks[0]); 75 return null; 76 } 77 78 87 public void removeOnetimeLocals() { 88 StructuredBlock secondBlock = subBlocks[1]; 89 if (secondBlock instanceof SequentialBlock) 90 secondBlock = ((SequentialBlock)secondBlock).subBlocks[0]; 91 if (subBlocks[0] instanceof InstructionBlock 92 && secondBlock instanceof InstructionContainer) { 93 InstructionBlock first = (InstructionBlock) subBlocks[0]; 94 InstructionContainer second = (InstructionContainer) secondBlock; 95 103 104 if (first.getInstruction() instanceof StoreInstruction) { 105 StoreInstruction store 106 = (StoreInstruction) first.getInstruction(); 107 if (store.getLValue() instanceof LocalStoreOperator 108 && (((LocalStoreOperator) store.getLValue()) 109 .getLocalInfo().getUseCount() == 2) 110 && (second.getInstruction().canCombine(store) > 0)) { 111 System.err.println("before: "+first+second); 112 113 second.setInstruction(second.getInstruction() 114 .combine(store)); 115 System.err.println("after: "+second); 116 StructuredBlock sb = subBlocks[1]; 117 sb.moveDefinitions(this, sb); 118 sb.replace(this); 119 sb.removeOnetimeLocals(); 120 return; 121 } 122 } 123 } 124 super.removeOnetimeLocals(); 125 } 126 127 134 public StructuredBlock getNextBlock(StructuredBlock subBlock) { 135 if (subBlock == subBlocks[0]) { 136 if (subBlocks[1].isEmpty()) 137 return subBlocks[1].getNextBlock(); 138 else 139 return subBlocks[1]; 140 } 141 return getNextBlock(); 142 } 143 144 public FlowBlock getNextFlowBlock(StructuredBlock subBlock) { 145 if (subBlock == subBlocks[0]) { 146 if (subBlocks[1].isEmpty()) 147 return subBlocks[1].getNextFlowBlock(); 148 else 149 return null; 150 } 151 return getNextFlowBlock(); 152 } 153 154 160 public boolean isSingleExit(StructuredBlock subBlock) { 161 return (subBlock == subBlocks[1]); 162 } 163 164 173 public Set propagateUsage() { 174 used = new SimpleSet(); 175 Set allUse = new SimpleSet(); 176 Set childUse0 = subBlocks[0].propagateUsage(); 177 Set childUse1 = subBlocks[1].propagateUsage(); 178 184 used.addAll(subBlocks[0].used); 185 if (subBlocks[0] instanceof LoopBlock) 186 ((LoopBlock) subBlocks[0]).removeLocallyDeclareable(used); 187 allUse.addAll(childUse0); 188 allUse.addAll(childUse1); 189 childUse0.retainAll(childUse1); 190 used.addAll(childUse0); 191 return allUse; 192 } 193 194 200 public void makeDeclaration(Set done) { 201 super.makeDeclaration(done); 202 if (subBlocks[0] instanceof InstructionBlock) 203 205 ((InstructionBlock) subBlocks[0]).checkDeclaration(this.declare); 206 } 207 208 public void dumpInstruction(TabbedPrintWriter writer) 209 throws java.io.IOException 210 { 211 subBlocks[0].dumpSource(writer); 212 subBlocks[1].dumpSource(writer); 213 } 214 215 221 public boolean replaceSubBlock(StructuredBlock oldBlock, 222 StructuredBlock newBlock) { 223 for (int i=0; i<2; i++) { 224 if (subBlocks[i] == oldBlock) { 225 subBlocks[i] = newBlock; 226 return true; 227 } 228 } 229 return false; 230 } 231 232 235 public StructuredBlock[] getSubBlocks() { 236 return subBlocks; 237 } 238 239 244 public boolean jumpMayBeChanged() { 245 return (subBlocks[1].jump != null || subBlocks[1].jumpMayBeChanged()); 246 } 247 } 248 | Popular Tags |