checking in 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="";
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(!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             st+=current_node.toString();
60             if (current_node.numNext()==0) {
61                 current_node=null;
62             } else if(current_node.numNext()==1) {
63                 FlatNode nextnode=current_node.getNext(0);
64                 if (visited.contains(nextnode)) {
65                     st+="goto L"+nodetolabel.get(nextnode)+"\n";
66                     current_node=null;
67                 } else
68                     current_node=nextnode;
69             } else if (current_node.numNext()==2) {
70                 /* Branch */
71                 st+=((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)));
72                 if (visited.contains(current_node.getNext(0))) {
73                     st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
74                     current_node=null;
75                 } else
76                     current_node=current_node.getNext(0);
77                 if (!visited.contains(current_node.getNext(1)))
78                     tovisit.add(current_node.getNext(1));
79             } else throw new Error();
80         }
81         return st;
82     }
83
84 }