1 19 20 package soot.dava.internal.SET; 21 22 import java.util.*; 23 import soot.util.*; 24 import soot.jimple.*; 25 import soot.dava.internal.asg.*; 26 27 public abstract class SETControlFlowNode extends SETNode 28 { 29 private AugmentedStmt characterizingStmt; 30 31 public SETControlFlowNode( AugmentedStmt characterizingStmt, IterableSet body) 32 { 33 super( body); 34 this.characterizingStmt = characterizingStmt; 35 } 36 37 public AugmentedStmt get_CharacterizingStmt() 38 { 39 return characterizingStmt; 40 } 41 42 protected boolean resolve( SETNode parent) 43 { 44 Iterator sbit = parent.get_SubBodies().iterator(); 45 while (sbit.hasNext()) { 46 IterableSet subBody = (IterableSet) sbit.next(); 47 48 if (subBody.contains( get_EntryStmt()) == false) 49 continue; 50 51 IterableSet childChain = (IterableSet) parent.get_Body2ChildChain().get( subBody); 52 HashSet childUnion = new HashSet(); 53 54 Iterator ccit = childChain.iterator(); 55 while (ccit.hasNext()) { 56 57 SETNode child = (SETNode) ccit.next(); 58 IterableSet childBody = child.get_Body(); 59 childUnion.addAll( childBody); 60 61 if (childBody.contains( characterizingStmt)) { 62 63 Iterator bit = get_Body().snapshotIterator(); 64 while (bit.hasNext()) { 65 AugmentedStmt as = (AugmentedStmt) bit.next(); 66 67 if (childBody.contains( as) == false) 68 remove_AugmentedStmt( as); 69 70 else if ((child instanceof SETControlFlowNode) && ((child instanceof SETUnconditionalWhileNode) == false)) { 71 SETControlFlowNode scfn = (SETControlFlowNode) child; 72 73 if ((scfn.get_CharacterizingStmt() == as) || 74 ((as.cpreds.size() == 1) && (as.get_Stmt() instanceof GotoStmt) && (scfn.get_CharacterizingStmt() == as.cpreds.get(0)))) 75 76 remove_AugmentedStmt( as); 77 } 78 } 79 80 return true; 81 } 82 } 83 } 84 85 return true; 86 } 87 } 88 | Popular Tags |