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

Unified Diff: sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart

Issue 459763003: dart2dart: Fix a scoping bug in the translation of loops. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Incorporated review comments. Created 6 years, 4 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 | tests/language/for_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index 1e708c4e8bbcd3decbd47cb0706df6fc3374ca25..535ef3132eb4cc1d5ef067f309a144c1e8b0e827 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -546,10 +546,6 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
context.add(new ir.InvokeContinuation(join, args, recursive: true));
context.current = null;
}
- assert(environment.index2value.length <= join.parameters.length);
- for (int i = 0; i < environment.index2value.length; ++i) {
- environment.index2value[i] = join.parameters[i];
- }
}
ir.Primitive visitFor(ast.For node) {
@@ -571,9 +567,9 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
//
// [[initializer]];
// let cont loop(x, ...) =
+ // let prim cond = [[condition]] in
// let cont exit() = [[successor]] in
// let cont body() = [[body]]; [[update]]; loop(v, ...) in
- // let prim cond = [[condition]] in
// branch cond (body, exit) in
// loop(v, ...)
@@ -600,28 +596,25 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
// continuation if control flow reaches the end of the body (update).
ir.Continuation bodyContinuation = new ir.Continuation([]);
ir.Continuation exitContinuation = new ir.Continuation([]);
- condBuilder.add(new ir.Branch(new ir.IsTrue(condition),
- bodyContinuation,
- exitContinuation));
+ condBuilder.add(
+ new ir.LetCont(exitContinuation,
+ new ir.LetCont(bodyContinuation,
+ new ir.Branch(new ir.IsTrue(condition),
+ bodyContinuation,
+ exitContinuation))));
List<ir.Parameter> parameters = condBuilder.parameters;
ir.Continuation loopContinuation = new ir.Continuation(parameters);
- // Copy the environment here because invokeJoin will update it for the
- // join-point continuation.
- List<ir.Primitive> entryArguments =
- new List<ir.Primitive>.from(environment.index2value);
if (bodyBuilder.isOpen) {
invokeRecursiveJoin(loopContinuation, [bodyBuilder]);
}
bodyContinuation.body = bodyBuilder.root;
- ir.Expression resultContext =
- new ir.LetCont(exitContinuation,
- new ir.LetCont(bodyContinuation,
- condBuilder.root));
- loopContinuation.body = resultContext;
+ loopContinuation.body = condBuilder.root;
add(new ir.LetCont(loopContinuation,
- new ir.InvokeContinuation(loopContinuation, entryArguments)));
- current = resultContext;
+ new ir.InvokeContinuation(loopContinuation,
+ environment.index2value)));
+ current = condBuilder.current;
+ environment = condBuilder.environment;
return null;
}
@@ -692,9 +685,9 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
// The CPS translation of [[while (condition) body; successor]] is:
//
// let cont loop(x, ...) =
+ // let prim cond = [[condition]] in
// let cont exit() = [[successor]] in
// let cont body() = [[body]]; continue(v, ...) in
- // let prim cond = [[condition]] in
// branch cond (body, exit) in
// loop(v, ...)
@@ -709,28 +702,25 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> {
// continuation if control flow reaches the end of the body.
ir.Continuation bodyContinuation = new ir.Continuation([]);
ir.Continuation exitContinuation = new ir.Continuation([]);
- condBuilder.add(new ir.Branch(new ir.IsTrue(condition),
- bodyContinuation,
- exitContinuation));
+ condBuilder.add(
+ new ir.LetCont(exitContinuation,
+ new ir.LetCont(bodyContinuation,
+ new ir.Branch(new ir.IsTrue(condition),
+ bodyContinuation,
+ exitContinuation))));
List<ir.Parameter> parameters = condBuilder.parameters;
ir.Continuation loopContinuation = new ir.Continuation(parameters);
- // Copy the environment here because invokeJoin will update it for the
- // join-point continuation.
- List<ir.Primitive> entryArguments =
- new List<ir.Primitive>.from(environment.index2value);
if (bodyBuilder.isOpen) {
invokeRecursiveJoin(loopContinuation, [bodyBuilder]);
}
bodyContinuation.body = bodyBuilder.root;
- ir.Expression resultContext =
- new ir.LetCont(exitContinuation,
- new ir.LetCont(bodyContinuation,
- condBuilder.root));
- loopContinuation.body = resultContext;
+ loopContinuation.body = condBuilder.root;
add(new ir.LetCont(loopContinuation,
- new ir.InvokeContinuation(loopContinuation, entryArguments)));
- current = resultContext;
+ new ir.InvokeContinuation(loopContinuation,
+ environment.index2value)));
+ current = condBuilder.current;
+ environment = condBuilder.environment;
return null;
}
« no previous file with comments | « no previous file | tests/language/for_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698