Chromium Code Reviews| Index: frog/leg/ssa/builder.dart |
| =================================================================== |
| --- frog/leg/ssa/builder.dart (revision 5615) |
| +++ frog/leg/ssa/builder.dart (working copy) |
| @@ -1039,7 +1039,8 @@ |
| */ |
| void endLoop(HBasicBlock loopEntry, |
| HBasicBlock branchBlock, |
| - BreakHandler breakHandler) { |
| + BreakHandler breakHandler, |
| + LocalsHandler savedLocals) { |
| HBasicBlock loopExitBlock = addNewBlock(); |
| assert(branchBlock.successors.length == 1); |
| List<LocalsHandler> breakLocals = <LocalsHandler>[]; |
| @@ -1053,6 +1054,8 @@ |
| if (!breakLocals.isEmpty()) { |
| breakLocals.add(localsHandler); |
|
floitsch
2012/03/17 22:25:00
add(savedLocals);
ngeoffray
2012/03/18 12:03:45
Thanks for the suggestion. Done.
|
| localsHandler = localsHandler.mergeMultiple(breakLocals, loopExitBlock); |
| + } else if (savedLocals != null) { |
| + localsHandler = savedLocals; |
| } |
| } |
| @@ -1132,8 +1135,7 @@ |
| updateBlock.addSuccessor(conditionBlock); |
| conditionBlock.postProcessLoopHeader(); |
| - endLoop(conditionBlock, conditionExitBlock, breakHandler); |
| - localsHandler = savedLocals; |
| + endLoop(conditionBlock, conditionExitBlock, breakHandler, savedLocals); |
| } |
| visitFor(For node) { |
| @@ -1167,7 +1169,7 @@ |
| conditionBlock.addSuccessor(loopEntryBlock); // The back-edge. |
| loopEntryBlock.postProcessLoopHeader(); |
| - endLoop(loopEntryBlock, conditionBlock, breakHandler); |
| + endLoop(loopEntryBlock, conditionBlock, breakHandler, null); |
|
floitsch
2012/03/17 22:25:00
localsHandler
ngeoffray
2012/03/18 12:03:45
Done.
|
| } |
| visitFunctionExpression(FunctionExpression node) { |
| @@ -2195,8 +2197,7 @@ |
| updateBlock.addSuccessor(conditionBlock); |
| conditionBlock.postProcessLoopHeader(); |
| - endLoop(conditionBlock, conditionExitBlock, breakHandler); |
| - localsHandler = savedLocals; |
| + endLoop(conditionBlock, conditionExitBlock, breakHandler, savedLocals); |
| breakHandler.close(); |
| } |