2 import IR.MethodDescriptor;
5 public class FlatMethod extends FlatNode {
7 MethodDescriptor method;
9 FlatMethod(MethodDescriptor md, FlatNode entry) {
14 public String toString() {
15 return method.toString();
18 public String printMethod() {
19 String st=method+"\n";
20 HashSet tovisit=new HashSet();
21 HashSet visited=new HashSet();
23 Hashtable nodetolabel=new Hashtable();
24 tovisit.add(method_entry);
25 FlatNode current_node=null;
27 //Node needs a label if it is
28 while(!tovisit.isEmpty()) {
29 FlatNode fn=(FlatNode)tovisit.iterator().next();
32 for(int i=0;i<fn.numNext();i++) {
33 FlatNode nn=fn.getNext(i);
36 nodetolabel.put(nn,new Integer(labelindex++));
38 if (!visited.contains(nn)) {
42 nodetolabel.put(nn,new Integer(labelindex++));
47 //Do the actual printing
48 tovisit=new HashSet();
49 visited=new HashSet();
50 tovisit.add(method_entry);
51 while(current_node!=null||!tovisit.isEmpty()) {
52 if (current_node==null) {
53 current_node=(FlatNode)tovisit.iterator().next();
54 tovisit.remove(current_node);
56 visited.add(current_node);
57 if (nodetolabel.containsKey(current_node))
58 st+="L"+nodetolabel.get(current_node)+":\n";
59 if (current_node.numNext()==0) {
60 st+=" "+current_node.toString()+"\n";
62 } else if(current_node.numNext()==1) {
63 st+=" "+current_node.toString()+"\n";
64 FlatNode nextnode=current_node.getNext(0);
65 if (visited.contains(nextnode)) {
66 st+="goto L"+nodetolabel.get(nextnode)+"\n";
69 current_node=nextnode;
70 } else if (current_node.numNext()==2) {
72 st+=" "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
73 if (!visited.contains(current_node.getNext(1)))
74 tovisit.add(current_node.getNext(1));
75 if (visited.contains(current_node.getNext(0))) {
76 st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
79 current_node=current_node.getNext(0);
80 } else throw new Error();