6 public class BuildFlat {
8 public BuildFlat(State st) {
12 public void buildFlat() {
13 Iterator it=state.classset.iterator();
15 ClassDescriptor cn=(ClassDescriptor)it.next();
20 private void flattenClass(ClassDescriptor cn) {
21 Iterator methodit=cn.getMethods();
22 while(methodit.hasNext()) {
23 MethodDescriptor md=(MethodDescriptor)methodit.next();
24 BlockNode bn=state.getMethodBody(md);
25 FlatNode fn=flattenBlockNode(bn).getBegin();
26 FlatMethod fm=new FlatMethod(md, fn);
27 state.addFlatCode(md,fm);
31 private NodePair flattenBlockNode(BlockNode bn) {
34 for(int i=0;i<bn.size();i++) {
35 NodePair np=flattenBlockStatementNode(bn.get(i));
36 FlatNode np_begin=np.getBegin();
37 FlatNode np_end=np.getEnd();
44 end.addNext(np_begin);
48 return new NodePair(begin,end);
51 private NodePair flattenBlockExpressionNode(BlockExpressionNode en) {
52 TempDescriptor tmp=TempDescriptor.tempFactory("neverused");
53 return flattenExpressionNode(en.getExpression(),tmp);
56 private NodePair flattenAssignmentNode(AssignmentNode an,TempDescriptor out_temp) {
60 private NodePair flattenCastNode(CastNode cn,TempDescriptor out_temp) {
64 private NodePair flattenCreateObjectNode(CreateObjectNode con,TempDescriptor out_temp) {
68 private NodePair flattenFieldAccessNode(FieldAccessNode fan,TempDescriptor out_temp) {
72 private NodePair flattenLiteralNode(LiteralNode ln,TempDescriptor out_temp) {
76 private NodePair flattenMethodInvokeNode(MethodInvokeNode min,TempDescriptor out_temp) {
80 private NodePair flattenNameNode(NameNode nn,TempDescriptor out_temp) {
84 private NodePair flattenOpNode(OpNode on,TempDescriptor out_temp) {
88 private NodePair flattenExpressionNode(ExpressionNode en, TempDescriptor out_temp) {
90 case Kind.AssignmentNode:
91 return flattenAssignmentNode((AssignmentNode)en,out_temp);
93 return flattenCastNode((CastNode)en,out_temp);
94 case Kind.CreateObjectNode:
95 return flattenCreateObjectNode((CreateObjectNode)en,out_temp);
96 case Kind.FieldAccessNode:
97 return flattenFieldAccessNode((FieldAccessNode)en,out_temp);
98 case Kind.LiteralNode:
99 return flattenLiteralNode((LiteralNode)en,out_temp);
100 case Kind.MethodInvokeNode:
101 return flattenMethodInvokeNode((MethodInvokeNode)en,out_temp);
103 return flattenNameNode((NameNode)en,out_temp);
105 return flattenOpNode((OpNode)en,out_temp);
110 private NodePair flattenDeclarationNode(DeclarationNode dn) {
114 private NodePair flattenIfStatementNode(IfStatementNode isn) {
115 TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
116 NodePair cond=flattenExpressionNode(isn.getCondition(),cond_temp);
117 FlatCondBranch fcb=new FlatCondBranch(cond_temp);
118 NodePair true_np=flattenBlockNode(isn.getTrueBlock());
120 FlatNop nopend=new FlatNop();
122 if (isn.getFalseBlock()!=null)
123 false_np=flattenBlockNode(isn.getFalseBlock());
125 FlatNop nop=new FlatNop();
126 false_np=new NodePair(nop,nop);
129 cond.getEnd().addNext(fcb);
130 fcb.addTrueNext(true_np.getBegin());
131 fcb.addFalseNext(false_np.getBegin());
132 true_np.getEnd().addNext(nopend);
133 false_np.getEnd().addNext(nopend);
134 return new NodePair(cond.getBegin(), nopend);
137 private NodePair flattenLoopNode(LoopNode ln) {
138 if (ln.getType()==LoopNode.FORLOOP) {
139 NodePair initializer=flattenBlockNode(ln.getInitializer());
140 TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
141 NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp);
142 NodePair update=flattenBlockNode(ln.getUpdate());
143 NodePair body=flattenBlockNode(ln.getBody());
144 FlatNode begin=initializer.getBegin();
145 FlatCondBranch fcb=new FlatCondBranch(cond_temp);
146 FlatNop nopend=new FlatNop();
148 initializer.getEnd().addNext(condition.getBegin());
149 body.getEnd().addNext(update.getBegin());
150 update.getEnd().addNext(condition.getBegin());
151 condition.getEnd().addNext(fcb);
152 fcb.addFalseNext(nopend);
153 fcb.addTrueNext(body.getBegin());
154 return new NodePair(begin,nopend);
155 } else if (ln.getType()==LoopNode.WHILELOOP) {
156 TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
157 NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp);
158 NodePair body=flattenBlockNode(ln.getBody());
159 FlatNode begin=condition.getBegin();
160 FlatCondBranch fcb=new FlatCondBranch(cond_temp);
161 FlatNop nopend=new FlatNop();
163 body.getEnd().addNext(condition.getBegin());
164 condition.getEnd().addNext(fcb);
165 fcb.addFalseNext(nopend);
166 fcb.addTrueNext(body.getBegin());
167 return new NodePair(begin,nopend);
168 } else if (ln.getType()==LoopNode.DOWHILELOOP) {
169 TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
170 NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp);
171 NodePair body=flattenBlockNode(ln.getBody());
172 FlatNode begin=body.getBegin();
173 FlatCondBranch fcb=new FlatCondBranch(cond_temp);
174 FlatNop nopend=new FlatNop();
176 body.getEnd().addNext(condition.getBegin());
177 condition.getEnd().addNext(fcb);
178 fcb.addFalseNext(nopend);
179 fcb.addTrueNext(body.getBegin());
180 return new NodePair(begin,nopend);
181 } else throw new Error();
184 private NodePair flattenReturnNode(ReturnNode rntree) {
185 TempDescriptor retval=TempDescriptor.tempFactory("ret_value");
186 NodePair cond=flattenExpressionNode(rntree.getReturnExpression(),retval);
187 FlatReturnNode rnflat=new FlatReturnNode(retval);
188 cond.getEnd().addNext(rnflat);
189 return new NodePair(cond.getBegin(),rnflat);
192 private NodePair flattenSubBlockNode(SubBlockNode sbn) {
193 return flattenBlockNode(sbn.getBlockNode());
196 private NodePair flattenBlockStatementNode(BlockStatementNode bsn) {
198 case Kind.BlockExpressionNode:
199 return flattenBlockExpressionNode((BlockExpressionNode)bsn);
201 case Kind.DeclarationNode:
202 return flattenDeclarationNode((DeclarationNode)bsn);
204 case Kind.IfStatementNode:
205 return flattenIfStatementNode((IfStatementNode)bsn);
208 return flattenLoopNode((LoopNode)bsn);
210 case Kind.ReturnNode:
211 return flattenReturnNode((IR.Tree.ReturnNode)bsn);
213 case Kind.SubBlockNode:
214 return flattenSubBlockNode((SubBlockNode)bsn);