2 import IR.MethodDescriptor;
3 import IR.TaskDescriptor;
6 public class FlatMethod extends FlatNode {
7 MethodDescriptor method;
11 Hashtable tagtointmap;
13 FlatMethod(MethodDescriptor md) {
16 parameterTemps=new Vector();
17 tagTemps=new Vector();
18 tagtointmap=new Hashtable();
21 FlatMethod(TaskDescriptor td) {
24 parameterTemps=new Vector();
25 tagTemps=new Vector();
26 tagtointmap=new Hashtable();
29 public String toString() {
30 if( method != null ) {
31 return method.toString();
33 return task.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 /** This method returns a set of the nodes in this flat representation */
79 public Set<FlatNode> getNodeSet() {
80 HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
81 HashSet<FlatNode> visited=new HashSet<FlatNode>();
83 while(!tovisit.isEmpty()) {
84 FlatNode fn=tovisit.iterator().next();
87 for(int i=0;i<fn.numNext();i++) {
88 FlatNode nn=fn.getNext(i);
89 if (!visited.contains(nn))
96 public String printMethod() {
97 return printMethod(null);
100 /** This method returns a string that is a human readable
101 * representation of this method. */
103 public String printMethod(Hashtable map) {
104 String st=method+" {\n";
105 HashSet tovisit=new HashSet();
106 HashSet visited=new HashSet();
108 Hashtable nodetolabel=new Hashtable();
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 for(int i=0;i<fn.numNext();i++) {
119 FlatNode nn=fn.getNext(i);
122 nodetolabel.put(nn,new Integer(labelindex++));
124 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
128 nodetolabel.put(nn,new Integer(labelindex++));
133 //Do the actual printing
134 tovisit=new HashSet();
135 visited=new HashSet();
137 while(current_node!=null||!tovisit.isEmpty()) {
138 if (current_node==null) {
139 current_node=(FlatNode)tovisit.iterator().next();
140 tovisit.remove(current_node);
142 visited.add(current_node);
143 if (nodetolabel.containsKey(current_node))
144 st+="L"+nodetolabel.get(current_node)+":\n";
145 if (current_node.numNext()==0) {
147 st+=" "+current_node.toString()+"\n";
149 st+=" "+current_node.toString()+"["+map.get(current_node)+"]\n";
151 } else if(current_node.numNext()==1) {
153 st+=" "+current_node.toString()+"\n";
155 st+=" "+current_node.toString()+"["+map.get(current_node)+"]\n";
156 FlatNode nextnode=current_node.getNext(0);
157 if (visited.contains(nextnode)) {
158 st+="goto L"+nodetolabel.get(nextnode)+"\n";
161 current_node=nextnode;
162 } else if (current_node.numNext()==2) {
164 st+=" "+((FlatCondBranch)current_node).toString("L"+nodetolabel.get(current_node.getNext(1)))+"\n";
165 if (!visited.contains(current_node.getNext(1)))
166 tovisit.add(current_node.getNext(1));
167 if (visited.contains(current_node.getNext(0))) {
168 st+="goto L"+nodetolabel.get(current_node.getNext(0))+"\n";
171 current_node=current_node.getNext(0);
172 } else throw new Error();
177 public TempDescriptor [] writesTemps() {
178 return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);