View Javadoc
1 /* GraphTalker.java */ 2 package org.quilt.cl; 3 4 import org.apache.bcel.generic.*; 5 import org.quilt.graph.*; 6 7 /*** 8 * Walks through a control flow graph, displaying information about 9 * each vertex and edge. Useful for debugging and as a model 10 * GraphXformer implementation. 11 * 12 * @author <a href="jddixon@users.sourceforge.net">Jim Dixon</a> 13 */ 14 public class GraphTalker implements GraphXformer, org.quilt.graph.Visitor { 15 16 private static String name = null; 17 18 public GraphTalker () { } 19 20 // INTERFACE VISITOR //////////////////////////////////////// 21 public void discoverGraph (Directed graph) { 22 ControlFlowGraph g = (ControlFlowGraph) graph; 23 System.out.println("--------------------------------------" ); 24 if (g.getParent() != null) 25 System.out.print("SUB"); 26 System.out.println("GRAPH with " + g.size() + " vertices"); 27 } 28 public void finishGraph (Directed graph) { 29 System.out.println("--------------------------------------" ); 30 } 31 public void discoverVertex (Vertex v) { 32 Connector conn = v.getConnector(); 33 // MAKE THIS A STRINGBUFFER 34 StringBuffer sb = new StringBuffer().append("VERTEX ").append(v); 35 if (v instanceof Entry) { 36 ControlFlowGraph parent 37 = (ControlFlowGraph)v.getGraph().getParent(); 38 sb.append(" graph " ).append(v.getGraph().getIndex()) 39 .append(" whose parent is graph "); 40 if (parent == null) { 41 sb.append ("<null>\n"); 42 } else { 43 sb.append(parent.getIndex()).append("\n"); 44 } 45 if (conn instanceof ComplexConnector) { 46 int k = conn.size(); 47 sb.append(" HANDLERS\n"); 48 for (int i = 0; i < k; i++) { 49 sb.append(" -> ") 50 .append(((ComplexConnector)conn).getEdge(i).getTarget()) 51 .append("\n"); 52 } 53 } 54 } else if (v instanceof Exit) { 55 sb.append(" EXIT\n"); 56 } else { 57 CodeVertex cv = (CodeVertex) v; 58 sb.append("\n instructions:\n"); 59 InstructionList ilist = cv.getInstructionList(); 60 Instruction[] inst = ilist.getInstructions(); 61 if (inst.length == 0) 62 sb.append(" none\n"); 63 for (int i = 0; i < inst.length; i++) { 64 sb.append(" ").append(inst[i]).append("\n"); 65 } 66 Instruction connInst = cv.getConnInst(); 67 if (connInst == null) { 68 sb.append( 69 " NO CONNECTING INSTRUCTION (flows through)\n"); 70 } else { 71 sb.append(" CONNECTING INST: ") 72 .append(connInst).append("\n"); 73 } 74 } 75 System.out.print(sb.toString()); 76 } 77 public void finishVertex (Vertex v) { 78 } 79 public void discoverEdge (Edge e) { 80 System.out.println(" EDGE " + e.getSource() 81 + " -> " + e.getTarget() ); 82 } 83 public void finishEdge (Edge e) { 84 } 85 86 // INTERFACE GRAPHXFORMER /////////////////////////////////// 87 public void xform (final ClassGen cg, final MethodGen method, 88 ControlFlowGraph cfg) { 89 Walker walker = new Walker(); 90 walker.visit (cfg, this); 91 } 92 public static String getName() { 93 return name; 94 } 95 public static void setName (String s) { 96 name = s; 97 } 98 }

This page was automatically generated by Maven