2 import IR.MethodDescriptor;
3 import IR.TaskDescriptor;
6 public class FlatMethod extends FlatNode {
8 MethodDescriptor method;
10 Vector parameterTemps;
12 Hashtable tagtointmap;
14 FlatMethod(MethodDescriptor md, FlatNode entry) {
18 parameterTemps=new Vector();
19 tagTemps=new Vector();
20 tagtointmap=new Hashtable();
23 FlatMethod(TaskDescriptor td, FlatNode entry) {
27 parameterTemps=new Vector();
28 tagTemps=new Vector();
29 tagtointmap=new Hashtable();
32 public String toString() {
33 return method.toString();
36 public MethodDescriptor getMethod() {
40 public TaskDescriptor getTask() {
44 public void addParameterTemp(TempDescriptor t) {
45 parameterTemps.add(t);
48 public int numParameters() {
49 return parameterTemps.size();
52 public void addTagTemp(TempDescriptor t) {
53 tagtointmap.put(t, new Integer(tagTemps.size()));
57 public int getTagInt(TempDescriptor t) {
58 return ((Integer)tagtointmap.get(t)).intValue();
61 public int numTags() {
62 return tagTemps.size();
65 public TempDescriptor getTag(int i) {
66 return (TempDescriptor) tagTemps.get(i);
69 public TempDescriptor getParameter(int i) {
70 return (TempDescriptor) parameterTemps.get(i);
73 public FlatNode methodEntryNode() {
78 public Set getNodeSet() {
79 HashSet tovisit=new HashSet();
80 HashSet visited=new HashSet();
81 tovisit.add(method_entry);
82 while(!tovisit.isEmpty()) {
83 FlatNode fn=(FlatNode)tovisit.iterator().next();
86 for(int i=0;i<fn.numNext();i++) {
87 FlatNode nn=fn.getNext(i);
88 if (!visited.contains(nn))
95 /** This method returns a string that is a human readable
96 * representation of this method. */
98 public String printMethod() {
99 String st=method+" {\n";
100 HashSet tovisit=new HashSet();
101 HashSet visited=new HashSet();
103 Hashtable nodetolabel=new Hashtable();
104 tovisit.add(method_entry);
105 FlatNode current_node=null;
107 //Node needs a label if it is
108 while(!tovisit.isEmpty()) {
109 FlatNode fn=(FlatNode)tovisit.iterator().next();
113 // System.out.println("Next : "+fn.numNext());
115 for(int i=0;i<fn.numNext();i++) {
116 FlatNode nn=fn.getNext(i);
119 nodetolabel.put(nn,new Integer(labelindex++));
121 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
125 nodetolabel.put(nn,new Integer(labelindex++));
130 //Do the actual printing
131 tovisit=new HashSet();
132 visited=new HashSet();
133 tovisit.add(method_entry);
134 while(current_node!=null||!tovisit.isEmpty()) {
135 if (current_node==null) {
136 current_node=(FlatNode)tovisit.iterator().next();
137 tovisit.remove(current_node);
139 visited.add(current_node);
140 if (nodetolabel.containsKey(current_node))
141 st+="L"+nodetolabel.get(current_node)+":\n";
142 if (current_node.numNext()==0) {
143 st+=" "+current_node.toString()+"\n";
145 } else if(current_node.numNext()==1) {
146 st+=" "+current_node.toString()+"\n";
147 FlatNode nextnode=current_node.getNext(0);
148 if (visited.contains(nextnode)) {
149 st+="goto L"+nodetolabel.get(nextnode)+"\n";
152 current_node=nextnode;
153 } else if (current_node.numNext()==2) {
155 st+=" "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
156 if (!visited.contains(current_node.getNext(1)))
157 tovisit.add(current_node.getNext(1));
158 if (visited.contains(current_node.getNext(0))) {
159 st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
162 current_node=current_node.getNext(0);
163 } else throw new Error();
168 public TempDescriptor [] writesTemps() {
169 return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);