2 import IR.MethodDescriptor;
5 public class FlatMethod extends FlatNode {
7 MethodDescriptor method;
10 FlatMethod(MethodDescriptor md, FlatNode entry) {
13 parameterTemps=new Vector();
16 public String toString() {
17 return method.toString();
20 public void addParameterTemp(TempDescriptor t) {
21 parameterTemps.add(t);
24 public String printMethod() {
25 String st=method+" {\n";
26 HashSet tovisit=new HashSet();
27 HashSet visited=new HashSet();
29 Hashtable nodetolabel=new Hashtable();
30 tovisit.add(method_entry);
31 FlatNode current_node=null;
33 //Node needs a label if it is
34 while(!tovisit.isEmpty()) {
35 FlatNode fn=(FlatNode)tovisit.iterator().next();
38 for(int i=0;i<fn.numNext();i++) {
39 FlatNode nn=fn.getNext(i);
42 nodetolabel.put(nn,new Integer(labelindex++));
44 if (!visited.contains(nn)) {
48 nodetolabel.put(nn,new Integer(labelindex++));
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);
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";
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";
75 current_node=nextnode;
76 } else if (current_node.numNext()==2) {
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";
85 current_node=current_node.getNext(0);
86 } else throw new Error();
91 public TempDescriptor [] writesTemps() {
92 return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);