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);
36 public FlatNode methodEntryNode() {
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();
49 for(int i=0;i<fn.numNext();i++) {
50 FlatNode nn=fn.getNext(i);
51 if (!visited.contains(nn))
58 public String printMethod() {
59 String st=method+" {\n";
60 HashSet tovisit=new HashSet();
61 HashSet visited=new HashSet();
63 Hashtable nodetolabel=new Hashtable();
64 tovisit.add(method_entry);
65 FlatNode current_node=null;
67 //Node needs a label if it is
68 while(!tovisit.isEmpty()) {
69 FlatNode fn=(FlatNode)tovisit.iterator().next();
72 for(int i=0;i<fn.numNext();i++) {
73 FlatNode nn=fn.getNext(i);
76 nodetolabel.put(nn,new Integer(labelindex++));
78 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
82 nodetolabel.put(nn,new Integer(labelindex++));
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);
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";
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";
109 current_node=nextnode;
110 } else if (current_node.numNext()==2) {
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";
119 current_node=current_node.getNext(0);
120 } else throw new Error();
125 public TempDescriptor [] writesTemps() {
126 return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);