more code
[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 MethodDescriptor getMethod() {
21         return method;
22     }
23     
24     public void addParameterTemp(TempDescriptor t) {
25         parameterTemps.add(t);
26     }
27
28     public int numParameters() {
29         return parameterTemps.size();
30     }
31
32     public TempDescriptor getParameter(int i) {
33         return (TempDescriptor) parameterTemps.get(i);
34     }
35
36
37     public Set getNodeSet() {
38         HashSet tovisit=new HashSet();
39         HashSet visited=new HashSet();
40         tovisit.add(method_entry);
41         while(!tovisit.isEmpty()) {
42             FlatNode fn=(FlatNode)tovisit.iterator().next();
43             tovisit.remove(fn);
44             visited.add(fn);
45             for(int i=0;i<fn.numNext();i++) {
46                 FlatNode nn=fn.getNext(i);
47                 if (!visited.contains(nn))
48                     tovisit.add(nn);
49             }
50         }
51         return visited;
52     }
53     
54     public String printMethod() {
55         String st=method+" {\n";
56         HashSet tovisit=new HashSet();
57         HashSet visited=new HashSet();
58         int labelindex=0;
59         Hashtable nodetolabel=new Hashtable();
60         tovisit.add(method_entry);
61         FlatNode current_node=null;
62         //Assign labels 1st
63         //Node needs a label if it is
64         while(!tovisit.isEmpty()) {
65             FlatNode fn=(FlatNode)tovisit.iterator().next();
66             tovisit.remove(fn);
67             visited.add(fn);
68             for(int i=0;i<fn.numNext();i++) {
69                 FlatNode nn=fn.getNext(i);
70                 if(i>0) {
71                     //1) Edge >1 of node
72                     nodetolabel.put(nn,new Integer(labelindex++));
73                 }
74                 if (!visited.contains(nn)) {
75                     tovisit.add(nn);
76                 } else {
77                     //2) Join point
78                     nodetolabel.put(nn,new Integer(labelindex++));
79                 }
80             }
81         }
82
83         //Do the actual printing
84         tovisit=new HashSet();
85         visited=new HashSet();
86         tovisit.add(method_entry);
87         while(current_node!=null||!tovisit.isEmpty()) {
88             if (current_node==null) {
89                 current_node=(FlatNode)tovisit.iterator().next();
90                 tovisit.remove(current_node);
91             }
92             visited.add(current_node);
93             if (nodetolabel.containsKey(current_node))
94                 st+="L"+nodetolabel.get(current_node)+":\n";
95             if (current_node.numNext()==0) {
96                 st+="   "+current_node.toString()+"\n";
97                 current_node=null;
98             } else if(current_node.numNext()==1) {
99                 st+="   "+current_node.toString()+"\n";
100                 FlatNode nextnode=current_node.getNext(0);
101                 if (visited.contains(nextnode)) {
102                     st+="goto L"+nodetolabel.get(nextnode)+"\n";
103                     current_node=null;
104                 } else
105                     current_node=nextnode;
106             } else if (current_node.numNext()==2) {
107                 /* Branch */
108                 st+="   "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
109                 if (!visited.contains(current_node.getNext(1)))
110                     tovisit.add(current_node.getNext(1));
111                 if (visited.contains(current_node.getNext(0))) {
112                     st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
113                     current_node=null;
114                 } else
115                     current_node=current_node.getNext(0);
116             } else throw new Error();
117         }
118         return st+"}\n";
119     }
120     
121     public TempDescriptor [] writesTemps() {
122         return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);
123     }
124 }