Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart

Issue 979753002: enterForLoop body should be in scope in for-loop update (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698