1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import java.util.IdentityHashMap ; 23 import java.util.Iterator ; 24 import java.util.Map ; 25 26 import org.apache.bcel.generic.InstructionHandle; 27 28 import edu.umd.cs.findbugs.SystemProperties; 29 import edu.umd.cs.findbugs.annotations.CheckForNull; 30 import edu.umd.cs.findbugs.annotations.CheckReturnValue; 31 32 41 public abstract class AbstractDataflowAnalysis <Fact> extends BasicAbstractDataflowAnalysis<Fact> { 42 private static final boolean DEBUG = SystemProperties.getBoolean("dataflow.transfer"); 43 44 47 48 56 public abstract void transferInstruction(InstructionHandle handle, BasicBlock basicBlock, Fact fact) throws DataflowAnalysisException; 57 58 62 @CheckReturnValue 63 public abstract boolean isFactValid(Fact fact); 64 65 73 @Override 74 public Fact getFactAtLocation(Location location) throws DataflowAnalysisException { 75 Fact start = getStartFact(location.getBasicBlock()); 76 Fact result = createFact(); 77 makeFactTop(result); 78 transfer(location.getBasicBlock(), location.getHandle(), start, result); 79 return result; 80 } 81 82 87 @Override 88 public Fact getFactAfterLocation(Location location) throws DataflowAnalysisException { 89 BasicBlock basicBlock = location.getBasicBlock(); 90 InstructionHandle handle = location.getHandle(); 91 92 if (handle == (isForwards() ? basicBlock.getLastInstruction() : basicBlock.getFirstInstruction())) 93 return getResultFact(basicBlock); 94 else 95 return getFactAtLocation(new Location(isForwards() ? handle.getNext() : handle.getPrev(), basicBlock)); 96 } 97 98 101 102 public void transfer(BasicBlock basicBlock, @CheckForNull InstructionHandle end, Fact start, Fact result) throws DataflowAnalysisException { 103 copy(start, result); 104 105 if (isFactValid(result)) { 106 Iterator <InstructionHandle> i = isForwards() ? basicBlock.instructionIterator() : basicBlock.instructionReverseIterator(); 107 108 while (i.hasNext()) { 109 InstructionHandle handle = i.next(); 110 if (handle == end) 111 break; 112 113 if (DEBUG && end == null) System.out.print("Transfer " + handle); 114 115 transferInstruction(handle, basicBlock, result); 117 118 if (DEBUG && end == null) System.out.println(" ==> " + result.toString()); 119 } 120 } 121 } 122 123 } 124 125 | Popular Tags |