1 19 20 25 26 27 package soot.jimple; 28 29 import soot.*; 30 import java.util.*; 31 32 41 42 51 public class NaiveSideEffectTester implements SideEffectTester 52 { 53 public void newMethod( SootMethod m ) { 54 } 55 56 58 public boolean unitCanReadFrom(Unit u, Value v) 59 { 60 Stmt s = (Stmt)u; 61 62 if (v instanceof Constant) 64 return false; 65 66 if (v instanceof Expr) 67 throw new RuntimeException ("can't deal with expr"); 68 69 if (s.containsInvokeExpr()) 71 { 72 if (!(v instanceof Local)) 73 return true; 74 } 75 76 Iterator useIt = u.getUseBoxes().iterator(); 78 while (useIt.hasNext()) 79 { 80 Value use = (Value)useIt.next(); 81 82 if (use.equivTo(v)) 83 return true; 84 85 Iterator vUseIt = v.getUseBoxes().iterator(); 86 while (vUseIt.hasNext()) 87 { 88 if (use.equivTo(vUseIt.next())) 89 return true; 90 } 91 } 92 return false; 93 } 94 95 public boolean unitCanWriteTo(Unit u, Value v) 96 { 97 Stmt s = (Stmt)u; 98 99 if (v instanceof Constant) 100 return false; 101 102 if (v instanceof Expr) 103 throw new RuntimeException ("can't deal with expr"); 104 105 if (s.containsInvokeExpr()) 107 { 108 if (!(v instanceof Local)) 109 return true; 110 } 111 112 Iterator defIt = u.getDefBoxes().iterator(); 114 while (defIt.hasNext()) 115 { 116 Value def = ((ValueBox)(defIt.next())).getValue(); 117 Iterator useIt = v.getUseBoxes().iterator(); 118 while (useIt.hasNext()) 119 { 120 Value use = ((ValueBox)useIt.next()).getValue(); 121 if (def.equivTo(use)) 122 return true; 123 } 124 if (def.equivTo(v)) 126 return true; 127 128 if (v instanceof InstanceFieldRef && 132 def instanceof InstanceFieldRef) 133 { 134 if (((InstanceFieldRef)v).getField() == 135 ((InstanceFieldRef)def).getField()) 136 return true; 137 } 138 } 139 return false; 140 } 141 } 142 | Popular Tags |