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 MethodDescriptor getMethod() {
24 public void addParameterTemp(TempDescriptor t) {
25 parameterTemps.add(t);
28 public int numParameters() {
29 return parameterTemps.size();
32 public TempDescriptor getParameter(int i) {
33 return (TempDescriptor) parameterTemps.get(i);
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();
45 for(int i=0;i<fn.numNext();i++) {
46 FlatNode nn=fn.getNext(i);
47 if (!visited.contains(nn))
54 public String printMethod() {
55 String st=method+" {\n";
56 HashSet tovisit=new HashSet();
57 HashSet visited=new HashSet();
59 Hashtable nodetolabel=new Hashtable();
60 tovisit.add(method_entry);
61 FlatNode current_node=null;
63 //Node needs a label if it is
64 while(!tovisit.isEmpty()) {
65 FlatNode fn=(FlatNode)tovisit.iterator().next();
68 for(int i=0;i<fn.numNext();i++) {
69 FlatNode nn=fn.getNext(i);
72 nodetolabel.put(nn,new Integer(labelindex++));
74 if (!visited.contains(nn)) {
78 nodetolabel.put(nn,new Integer(labelindex++));
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);
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";
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";
105 current_node=nextnode;
106 } else if (current_node.numNext()==2) {
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";
115 current_node=current_node.getNext(0);
116 } else throw new Error();
121 public TempDescriptor [] writesTemps() {
122 return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);