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

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

Issue 686743002: Support while loop in analyzer2dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 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 | « sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart ('k') | no next file » | 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_visitor.dart
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
index 085a1c6636183ed4e055906cc89189116200e06e..da5831ba32805840c012a18a91ebd48e3429400c 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
@@ -245,85 +245,11 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
: giveup(node, 'labeled statement');
}
- ir.Primitive visitWhile(ast.While node) {
- assert(irBuilder.isOpen);
- // While loops use four named continuations: the entry to the body, the
- // loop exit, the loop back edge (continue), and the loop exit (break).
- // The CPS translation of [[while (condition) body; successor]] is:
- //
- // let cont continue(x, ...) =
- // let prim cond = [[condition]] in
- // let cont break() = [[successor]] in
- // let cont exit() = break(v, ...) in
- // let cont body() = [[body]]; continue(v, ...) in
- // branch cond (body, exit) in
- // continue(v, ...)
- //
- // If there are no breaks in the body, the break continuation is inlined
- // in the exit continuation (i.e., the translation of the successor
- // statement occurs in the exit continuation).
-
- // The condition and body are delimited.
- IrBuilder condBuilder = new IrBuilder.recursive(irBuilder);
- ir.Primitive condition =
- withBuilder(condBuilder, () => visit(node.condition));
-
- JumpTarget target = elements.getTargetDefinition(node);
- JumpCollector breakCollector = new JumpCollector(target);
- JumpCollector continueCollector = new JumpCollector(target);
- irBuilder.state.breakCollectors.add(breakCollector);
- irBuilder.state.continueCollectors.add(continueCollector);
-
- IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
- withBuilder(bodyBuilder, () => visit(node.body));
- assert(irBuilder.state.breakCollectors.last == breakCollector);
- assert(irBuilder.state.continueCollectors.last == continueCollector);
- irBuilder.state.breakCollectors.removeLast();
- irBuilder.state.continueCollectors.removeLast();
-
- // Create body entry and loop exit continuations and a branch to them.
- ir.Continuation bodyContinuation = new ir.Continuation([]);
- ir.Continuation exitContinuation = new ir.Continuation([]);
- ir.LetCont branch =
- new ir.LetCont(exitContinuation,
- new ir.LetCont(bodyContinuation,
- new ir.Branch(new ir.IsTrue(condition),
- bodyContinuation,
- exitContinuation)));
- // If there are breaks in the body, then there must be a join-point
- // continuation for the normal exit and the breaks.
- bool hasBreaks = !breakCollector.isEmpty;
- ir.LetCont letJoin;
- if (hasBreaks) {
- letJoin = new ir.LetCont(null, branch);
- condBuilder.add(letJoin);
- condBuilder._current = branch;
- } else {
- condBuilder.add(branch);
- }
- ir.Continuation loopContinuation =
- new ir.Continuation(condBuilder._parameters);
- if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
- irBuilder.invokeFullJoin(
- loopContinuation, continueCollector, recursive: true);
- bodyContinuation.body = bodyBuilder._root;
-
- loopContinuation.body = condBuilder._root;
- irBuilder.add(new ir.LetCont(loopContinuation,
- new ir.InvokeContinuation(loopContinuation,
- irBuilder.environment.index2value)));
- if (hasBreaks) {
- irBuilder._current = branch;
- irBuilder.environment = condBuilder.environment;
- breakCollector.addJump(irBuilder);
- letJoin.continuation =
- irBuilder.createJoin(irBuilder.environment.length, breakCollector);
- irBuilder._current = letJoin;
- } else {
- irBuilder._current = condBuilder._current;
- irBuilder.environment = condBuilder.environment;
- }
- return null;
+ visitWhile(ast.While node) {
+ irBuilder.buildWhile(
+ buildCondition: subbuild(node.condition),
+ buildBody: subbuild(node.body),
+ target: elements.getTargetDefinition(node));
}
ir.Primitive visitForIn(ast.ForIn node) {
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698