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     Vector parameterTemps;
9
10     FlatMethod(MethodDescriptor md, FlatNode entry) {
11         method=md;
12         method_entry=entry;
13         parameterTemps=new Vector();
14     }
15
16     public String toString() {
17         return method.toString();
18     }
19     
20     public void addParameterTemp(TempDescriptor t) {
21         parameterTemps.add(t);
22     }
23
24     public String printMethod() {
25         String st=method+" {\n";
26         HashSet tovisit=new HashSet();
27         HashSet visited=new HashSet();
28         int labelindex=0;
29         Hashtable nodetolabel=new Hashtable();
30         tovisit.add(method_entry);
31         FlatNode current_node=null;
32         //Assign labels 1st
33         //Node needs a label if it is
34         while(!tovisit.isEmpty()) {
35             FlatNode fn=(FlatNode)tovisit.iterator().next();
36             tovisit.remove(fn);
37             visited.add(fn);
38             for(int i=0;i<fn.numNext();i++) {
39                 FlatNode nn=fn.getNext(i);
40                 if(i>0) {
41                     //1) Edge >1 of node
42                     nodetolabel.put(nn,new Integer(labelindex++));
43                 }
44                 if (!visited.contains(nn)) {
45                     tovisit.add(nn);
46                 } else {
47                     //2) Join point
48                     nodetolabel.put(nn,new Integer(labelindex++));
49                 }
50             }
51         }
52
53         //Do the actual printing
54         tovisit=new HashSet();
55         visited=new HashSet();
56         tovisit.add(method_entry);
57         while(current_node!=null||!tovisit.isEmpty()) {
58             if (current_node==null) {
59                 current_node=(FlatNode)tovisit.iterator().next();
60                 tovisit.remove(current_node);
61             }
62             visited.add(current_node);
63             if (nodetolabel.containsKey(current_node))
64                 st+="L"+nodetolabel.get(current_node)+":\n";
65             if (current_node.numNext()==0) {
66                 st+="   "+current_node.toString()+"\n";
67                 current_node=null;
68             } else if(current_node.numNext()==1) {
69                 st+="   "+current_node.toString()+"\n";
70                 FlatNode nextnode=current_node.getNext(0);
71                 if (visited.contains(nextnode)) {
72                     st+="goto L"+nodetolabel.get(nextnode)+"\n";
73                     current_node=null;
74                 } else
75                     current_node=nextnode;
76             } else if (current_node.numNext()==2) {
77                 /* Branch */
78                 st+="   "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
79                 if (!visited.contains(current_node.getNext(1)))
80                     tovisit.add(current_node.getNext(1));
81                 if (visited.contains(current_node.getNext(0))) {
82                     st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
83                     current_node=null;
84                 } else
85                     current_node=current_node.getNext(0);
86             } else throw new Error();
87         }
88         return st+"}\n";
89     }
90     
91     public TempDescriptor [] writesTemps() {
92         return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);
93     }
94 }