| 1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import java.io.PrintStream ; 23 24 import org.apache.bcel.generic.InstructionHandle; 25 26 30 public class DataflowCFGPrinter <Fact, AnalysisType extends BasicAbstractDataflowAnalysis<Fact>> extends CFGPrinter { 31 private Dataflow<Fact, AnalysisType> dataflow; 32 33 public DataflowCFGPrinter(Dataflow<Fact, AnalysisType> dataflow) { 34 super(dataflow.getCFG()); 35 this.dataflow = dataflow; 36 37 setIsForwards(dataflow.getAnalysis().isForwards()); 38 } 39 40 43 @Override  44 public String edgeAnnotate(Edge edge) { 45 String edgeAnnotation= ""; 46 try { 47 edgeAnnotation = " " + dataflow.getAnalysis().factToString(dataflow.getAnalysis().getFactOnEdge(edge)); 48 } catch (Throwable e) { 49 } 51 return edgeAnnotation; 52 } 53 54 @Override  55 public String blockStartAnnotate(BasicBlock bb) { 56 boolean flip = isForwards() != dataflow.getAnalysis().isForwards(); 57 Fact fact = flip ? dataflow.getResultFact(bb) : dataflow.getStartFact(bb); 58 59 return " " + dataflow.getAnalysis().factToString(fact); 60 } 61 62 @Override  63 public String blockAnnotate(BasicBlock bb) { 64 boolean flip = isForwards() != dataflow.getAnalysis().isForwards(); 65 Fact fact = flip ? dataflow.getStartFact(bb) : dataflow.getResultFact(bb) ; 66 67 return " " + dataflow.getAnalysis().factToString(fact); 68 } 69 70 @Override  71 public String instructionAnnotate(InstructionHandle handle, BasicBlock bb) { 72 try { 73 boolean flip = isForwards() != dataflow.getAnalysis().isForwards(); 74 75 Location loc =new Location(handle, bb); 76 77 Fact fact = flip 78 ? dataflow.getAnalysis().getFactAfterLocation(loc) 79 : dataflow.getAnalysis().getFactAtLocation(loc); 80 return " " + dataflow.getAnalysis().factToString(fact); 81 } catch (DataflowAnalysisException e) { 82 throw new IllegalStateException ("Caught exception: " + e.toString()); 83 } 84 } 85 86 94 public static<Fact, AnalysisType extends BasicAbstractDataflowAnalysis<Fact>> 95 void printCFG(Dataflow<Fact, AnalysisType> dataflow, PrintStream out) { 96 DataflowCFGPrinter<Fact, AnalysisType> printer = 97 new DataflowCFGPrinter<Fact, AnalysisType>(dataflow); 98 printer.print(out); 99 } 100 101 } 102 103 | Popular Tags |