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