2 import IR.MethodDescriptor;
3 import IR.TaskDescriptor;
6 public class FlatMethod extends FlatNode {
8 MethodDescriptor method;
10 Vector parameterTemps;
12 FlatMethod(MethodDescriptor md, FlatNode entry) {
16 parameterTemps=new Vector();
19 FlatMethod(TaskDescriptor td, FlatNode entry) {
23 parameterTemps=new Vector();
26 public String toString() {
27 return method.toString();
30 public MethodDescriptor getMethod() {
34 public void addParameterTemp(TempDescriptor t) {
35 parameterTemps.add(t);
38 public int numParameters() {
39 return parameterTemps.size();
42 public TempDescriptor getParameter(int i) {
43 return (TempDescriptor) parameterTemps.get(i);
46 public FlatNode methodEntryNode() {
51 public Set getNodeSet() {
52 HashSet tovisit=new HashSet();
53 HashSet visited=new HashSet();
54 tovisit.add(method_entry);
55 while(!tovisit.isEmpty()) {
56 FlatNode fn=(FlatNode)tovisit.iterator().next();
59 for(int i=0;i<fn.numNext();i++) {
60 FlatNode nn=fn.getNext(i);
61 if (!visited.contains(nn))
68 public String printMethod() {
69 String st=method+" {\n";
70 HashSet tovisit=new HashSet();
71 HashSet visited=new HashSet();
73 Hashtable nodetolabel=new Hashtable();
74 tovisit.add(method_entry);
75 FlatNode current_node=null;
77 //Node needs a label if it is
78 while(!tovisit.isEmpty()) {
79 FlatNode fn=(FlatNode)tovisit.iterator().next();
82 for(int i=0;i<fn.numNext();i++) {
83 FlatNode nn=fn.getNext(i);
86 nodetolabel.put(nn,new Integer(labelindex++));
88 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
92 nodetolabel.put(nn,new Integer(labelindex++));
97 //Do the actual printing
98 tovisit=new HashSet();
99 visited=new HashSet();
100 tovisit.add(method_entry);
101 while(current_node!=null||!tovisit.isEmpty()) {
102 if (current_node==null) {
103 current_node=(FlatNode)tovisit.iterator().next();
104 tovisit.remove(current_node);
106 visited.add(current_node);
107 if (nodetolabel.containsKey(current_node))
108 st+="L"+nodetolabel.get(current_node)+":\n";
109 if (current_node.numNext()==0) {
110 st+=" "+current_node.toString()+"\n";
112 } else if(current_node.numNext()==1) {
113 st+=" "+current_node.toString()+"\n";
114 FlatNode nextnode=current_node.getNext(0);
115 if (visited.contains(nextnode)) {
116 st+="goto L"+nodetolabel.get(nextnode)+"\n";
119 current_node=nextnode;
120 } else if (current_node.numNext()==2) {
122 st+=" "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
123 if (!visited.contains(current_node.getNext(1)))
124 tovisit.add(current_node.getNext(1));
125 if (visited.contains(current_node.getNext(0))) {
126 st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
129 current_node=current_node.getNext(0);
130 } else throw new Error();
135 public TempDescriptor [] writesTemps() {
136 return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);