| Index: frog/leg/ssa/builder.dart
|
| ===================================================================
|
| --- frog/leg/ssa/builder.dart (revision 5618)
|
| +++ 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>[];
|
| @@ -1051,8 +1052,10 @@
|
| open(loopExitBlock);
|
| localsHandler.endLoop(loopEntry);
|
| if (!breakLocals.isEmpty()) {
|
| - breakLocals.add(localsHandler);
|
| + breakLocals.add(savedLocals);
|
| localsHandler = localsHandler.mergeMultiple(breakLocals, loopExitBlock);
|
| + } else {
|
| + 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, localsHandler);
|
| }
|
|
|
| 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();
|
| }
|
|
|
|
|