Chromium Code Reviews| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| index b0bc57c952d98caeae7607b22b66fad27d4a147b..fe22ccce9bbca5f82034165e8a5cc50dcf0e6dd2 100644 |
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| @@ -949,6 +949,7 @@ abstract class IrBuilder { |
| // let cont break() = [[successor]] in |
| // let cont exit() = break(v, ...) in |
| // let cont body() = |
| + // [[enterBody]]; |
|
Kevin Millikin (Google)
2015/03/04 10:51:05
Maybe we should spell this _enterForLoopBody (to m
asgerf
2015/03/04 13:34:08
Done.
Kevin Millikin (Google)
2015/03/04 13:36:12
Excellent.
|
| // let cont continue(x, ...) = [[update]]; loop(v, ...) in |
| // [[body]]; continue(v, ...) in |
| // branch cond (body, exit) in |
| @@ -976,11 +977,12 @@ abstract class IrBuilder { |
| state.breakCollectors.add(breakCollector); |
| state.continueCollectors.add(continueCollector); |
| - IrBuilder bodyBuilder = condBuilder.makeDelimitedBuilder(); |
| + IrBuilder outerBodyBuilder = condBuilder.makeDelimitedBuilder(); |
|
Kevin Millikin (Google)
2015/03/04 10:51:05
I wish we weren't out of good names to use in this
|
| + outerBodyBuilder._enterForLoopBody(closureScope, loopVariables); |
| - bodyBuilder._enterForLoopBody(closureScope, loopVariables); |
| + IrBuilder innerBodyBuilder = outerBodyBuilder.makeDelimitedBuilder(); |
| - buildBody(bodyBuilder); |
| + buildBody(innerBodyBuilder); |
| assert(state.breakCollectors.last == breakCollector); |
| assert(state.continueCollectors.last == continueCollector); |
| state.breakCollectors.removeLast(); |
| @@ -992,8 +994,8 @@ abstract class IrBuilder { |
| // is instead placed just outside the body of the body continuation. |
| bool hasContinues = !continueCollector.isEmpty; |
| IrBuilder updateBuilder = hasContinues |
| - ? condBuilder.makeRecursiveBuilder() |
| - : bodyBuilder; |
| + ? outerBodyBuilder.makeRecursiveBuilder() |
| + : innerBodyBuilder; |
| updateBuilder._enterForLoopUpdate(closureScope, loopVariables); |
| buildUpdate(updateBuilder); |
| @@ -1024,7 +1026,7 @@ abstract class IrBuilder { |
| // If there are continues in the body, we need a named continue |
| // continuation as a join point. |
| continueContinuation = new ir.Continuation(updateBuilder._parameters); |
| - if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder); |
| + if (innerBodyBuilder.isOpen) continueCollector.addJump(innerBodyBuilder); |
| invokeFullJoin(continueContinuation, continueCollector); |
| } |
| ir.Continuation loopContinuation = |
| @@ -1039,12 +1041,12 @@ abstract class IrBuilder { |
| // only after it is guaranteed that they are not empty. |
| if (hasContinues) { |
| continueContinuation.body = updateBuilder._root; |
| - bodyContinuation.body = |
| - new ir.LetCont(continueContinuation, |
| - bodyBuilder._root); |
| + outerBodyBuilder.add(new ir.LetCont(continueContinuation, |
| + innerBodyBuilder._root)); |
| } else { |
| - bodyContinuation.body = bodyBuilder._root; |
| + outerBodyBuilder.add(innerBodyBuilder._root); |
| } |
| + bodyContinuation.body = outerBodyBuilder._root; |
| loopContinuation.body = condBuilder._root; |
| add(new ir.LetCont(loopContinuation, |