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() {
45 return FKind.FlatMethod;
48 public void addParameterTemp(TempDescriptor t) {
49 parameterTemps.add(t);
52 public int numParameters() {
53 return parameterTemps.size();
56 public void addTagTemp(TempDescriptor t) {
57 tagtointmap.put(t, new Integer(tagTemps.size()));
61 public int getTagInt(TempDescriptor t) {
62 return ((Integer)tagtointmap.get(t)).intValue();
65 public int numTags() {
66 return tagTemps.size();
69 public TempDescriptor getTag(int i) {
70 return (TempDescriptor) tagTemps.get(i);
73 public TempDescriptor getParameter(int i) {
74 return (TempDescriptor) parameterTemps.get(i);
77 public FlatNode methodEntryNode() {
81 /** This method returns a set of the nodes in this flat representation */
83 public Set getNodeSet() {
84 HashSet tovisit=new HashSet();
85 HashSet visited=new HashSet();
86 tovisit.add(method_entry);
87 while(!tovisit.isEmpty()) {
88 FlatNode fn=(FlatNode)tovisit.iterator().next();
91 for(int i=0;i<fn.numNext();i++) {
92 FlatNode nn=fn.getNext(i);
93 if (!visited.contains(nn))
100 /** This method returns a string that is a human readable
101 * representation of this method. */
103 public String printMethod() {
104 String st=method+" {\n";
105 HashSet tovisit=new HashSet();
106 HashSet visited=new HashSet();
108 Hashtable nodetolabel=new Hashtable();
109 tovisit.add(method_entry);
110 FlatNode current_node=null;
112 //Node needs a label if it is
113 while(!tovisit.isEmpty()) {
114 FlatNode fn=(FlatNode)tovisit.iterator().next();
118 // System.out.println("Next : "+fn.numNext());
120 for(int i=0;i<fn.numNext();i++) {
121 FlatNode nn=fn.getNext(i);
124 nodetolabel.put(nn,new Integer(labelindex++));
126 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
130 nodetolabel.put(nn,new Integer(labelindex++));
135 //Do the actual printing
136 tovisit=new HashSet();
137 visited=new HashSet();
138 tovisit.add(method_entry);
139 while(current_node!=null||!tovisit.isEmpty()) {
140 if (current_node==null) {
141 current_node=(FlatNode)tovisit.iterator().next();
142 tovisit.remove(current_node);
144 visited.add(current_node);
145 if (nodetolabel.containsKey(current_node))
146 st+="L"+nodetolabel.get(current_node)+":\n";
147 if (current_node.numNext()==0) {
148 st+=" "+current_node.toString()+"\n";
150 } else if(current_node.numNext()==1) {
151 st+=" "+current_node.toString()+"\n";
152 FlatNode nextnode=current_node.getNext(0);
153 if (visited.contains(nextnode)) {
154 st+="goto L"+nodetolabel.get(nextnode)+"\n";
157 current_node=nextnode;
158 } else if (current_node.numNext()==2) {
160 st+=" "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
161 if (!visited.contains(current_node.getNext(1)))
162 tovisit.add(current_node.getNext(1));
163 if (visited.contains(current_node.getNext(0))) {
164 st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
167 current_node=current_node.getNext(0);
168 } else throw new Error();
173 public TempDescriptor [] writesTemps() {
174 return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);