more changes
[IRC.git] / Robust / src / IR / Flat / FlatMethod.java
1 package IR.Flat;
2 import IR.MethodDescriptor;
3 import java.util.*;
4
5 public class FlatMethod extends FlatNode {
6     FlatNode method_entry;
7     MethodDescriptor method;
8
9     FlatMethod(MethodDescriptor md, FlatNode entry) {
10         method=md;
11         method_entry=entry;
12     }
13     
14     public String toString() {
15         return method.toString();
16     }
17     
18     public String printMethod() {
19         String st=method+"\n";
20         HashSet tovisit=new HashSet();
21         HashSet visited=new HashSet();
22         int labelindex=0;
23         Hashtable nodetolabel=new Hashtable();
24         tovisit.add(method_entry);
25         FlatNode current_node=null;
26         //Assign labels 1st
27         //Node needs a label if it is
28         while(!tovisit.isEmpty()) {
29             FlatNode fn=(FlatNode)tovisit.iterator().next();
30             tovisit.remove(fn);
31             visited.add(fn);
32             for(int i=0;i<fn.numNext();i++) {
33                 FlatNode nn=fn.getNext(i);
34                 if(i>0) {
35                     //1) Edge >1 of node
36                     nodetolabel.put(nn,new Integer(labelindex++));
37                 }
38                 if (!visited.contains(nn)) {
39                     tovisit.add(nn);
40                 } else {
41                     //2) Join point
42                     nodetolabel.put(nn,new Integer(labelindex++));
43                 }
44             }
45         }
46
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);
55             }
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";
61                 current_node=null;
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";
67                     current_node=null;
68                 } else
69                     current_node=nextnode;
70             } else if (current_node.numNext()==2) {
71                 /* Branch */
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";
77                     current_node=null;
78                 } else
79                     current_node=current_node.getNext(0);
80             } else throw new Error();
81         }
82         return st;
83     }
84
85 }