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) {
55 private NodePair flattenExpressionNode(ExpressionNode en) {
59 private NodePair flattenDeclarationNode(DeclarationNode dn) {
63 private NodePair flattenIfStatementNode(IfStatementNode isn) {
67 private NodePair flattenLoopNode(LoopNode ln) {
68 if (ln.getType()==LoopNode.FORLOOP) {
69 NodePair initializer=flattenBlockNode(ln.getInitializer());
70 TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
71 NodePair condition=flattenExpressionNode(ln.getCondition());
72 NodePair update=flattenBlockNode(ln.getUpdate());
73 NodePair body=flattenBlockNode(ln.getBody());
74 FlatNode begin=initializer.getBegin();
75 FlatCondBranch fcb=new FlatCondBranch(cond_temp);
76 FlatNop nopend=new FlatNop();
78 initializer.getEnd().addNext(condition.getBegin());
79 body.getEnd().addNext(update.getBegin());
80 update.getEnd().addNext(condition.getBegin());
81 condition.getEnd().addNext(fcb);
82 fcb.addFalseNext(nopend);
83 fcb.addTrueNext(body.getBegin());
84 return new NodePair(begin,nopend);
85 } else if (ln.getType()==LoopNode.WHILELOOP) {
86 TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
87 NodePair condition=flattenExpressionNode(ln.getCondition());
88 NodePair body=flattenBlockNode(ln.getBody());
89 FlatNode begin=condition.getBegin();
90 FlatCondBranch fcb=new FlatCondBranch(cond_temp);
91 FlatNop nopend=new FlatNop();
93 body.getEnd().addNext(condition.getBegin());
94 condition.getEnd().addNext(fcb);
95 fcb.addFalseNext(nopend);
96 fcb.addTrueNext(body.getBegin());
97 return new NodePair(begin,nopend);
98 } else if (ln.getType()==LoopNode.DOWHILELOOP) {
99 TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
100 NodePair condition=flattenExpressionNode(ln.getCondition());
101 NodePair body=flattenBlockNode(ln.getBody());
102 FlatNode begin=body.getBegin();
103 FlatCondBranch fcb=new FlatCondBranch(cond_temp);
104 FlatNop nopend=new FlatNop();
106 body.getEnd().addNext(condition.getBegin());
107 condition.getEnd().addNext(fcb);
108 fcb.addFalseNext(nopend);
109 fcb.addTrueNext(body.getBegin());
110 return new NodePair(begin,nopend);
111 } else throw new Error();
114 private NodePair flattenReturnNode(IR.Tree.ReturnNode rntree) {
118 private NodePair flattenSubBlockNode(SubBlockNode sbn) {
119 return flattenBlockNode(sbn.getBlockNode());
122 private NodePair flattenBlockStatementNode(BlockStatementNode bsn) {
124 case Kind.BlockExpressionNode:
125 return flattenBlockExpressionNode((BlockExpressionNode)bsn);
127 case Kind.DeclarationNode:
128 return flattenDeclarationNode((DeclarationNode)bsn);
130 case Kind.IfStatementNode:
131 return flattenIfStatementNode((IfStatementNode)bsn);
134 return flattenLoopNode((LoopNode)bsn);
136 case Kind.ReturnNode:
137 return flattenReturnNode((IR.Tree.ReturnNode)bsn);
139 case Kind.SubBlockNode:
140 return flattenSubBlockNode((SubBlockNode)bsn);