| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../closure.dart' show LoopClosureRepresentationInfo; | 7 import '../closure.dart' show ClosureBase; |
| 8 import '../elements/jumps.dart'; | 8 import '../elements/jumps.dart'; |
| 9 import '../io/source_information.dart'; | 9 import '../io/source_information.dart'; |
| 10 import '../tree/tree.dart' as ast; | 10 import '../tree/tree.dart' as ast; |
| 11 | 11 |
| 12 import 'builder.dart'; | 12 import 'builder.dart'; |
| 13 import 'builder_kernel.dart'; | 13 import 'builder_kernel.dart'; |
| 14 import 'graph_builder.dart'; | 14 import 'graph_builder.dart'; |
| 15 import 'jump_handler.dart'; | 15 import 'jump_handler.dart'; |
| 16 import 'kernel_ast_adapter.dart'; | 16 import 'kernel_ast_adapter.dart'; |
| 17 import 'locals_handler.dart'; | 17 import 'locals_handler.dart'; |
| 18 import 'nodes.dart'; | 18 import 'nodes.dart'; |
| 19 | 19 |
| 20 /// Builds the SSA graph for loop nodes. | 20 /// Builds the SSA graph for loop nodes. |
| 21 abstract class LoopHandler<T> { | 21 abstract class LoopHandler<T> { |
| 22 final GraphBuilder builder; | 22 final GraphBuilder builder; |
| 23 | 23 |
| 24 LoopHandler(this.builder); | 24 LoopHandler(this.builder); |
| 25 | 25 |
| 26 /// Builds a graph for the given [loop] node. | 26 /// Builds a graph for the given [loop] node. |
| 27 /// | 27 /// |
| 28 /// For while loops, [initialize] and [update] are null. | 28 /// For while loops, [initialize] and [update] are null. |
| 29 /// The [condition] function must return a boolean result. | 29 /// The [condition] function must return a boolean result. |
| 30 /// None of the functions must leave anything on the stack. | 30 /// None of the functions must leave anything on the stack. |
| 31 void handleLoop(T loop, LoopClosureRepresentationInfo loopClosureInfo, | 31 void handleLoop(T loop, ClosureBase loopClosureInfo, void initialize(), |
| 32 void initialize(), HInstruction condition(), void update(), void body()) { | 32 HInstruction condition(), void update(), void body()) { |
| 33 // Generate: | 33 // Generate: |
| 34 // <initializer> | 34 // <initializer> |
| 35 // loop-entry: | 35 // loop-entry: |
| 36 // if (!<condition>) goto loop-exit; | 36 // if (!<condition>) goto loop-exit; |
| 37 // <body> | 37 // <body> |
| 38 // <updates> | 38 // <updates> |
| 39 // goto loop-entry; | 39 // goto loop-entry; |
| 40 // loop-exit: | 40 // loop-exit: |
| 41 | 41 |
| 42 builder.localsHandler.startLoop(loopClosureInfo); | 42 builder.localsHandler.startLoop(loopClosureInfo); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 HLoopBlockInformation.DO_WHILE_LOOP; | 386 HLoopBlockInformation.DO_WHILE_LOOP; |
| 387 | 387 |
| 388 @override | 388 @override |
| 389 int visitForInStatement(ir.ForInStatement node) => | 389 int visitForInStatement(ir.ForInStatement node) => |
| 390 HLoopBlockInformation.FOR_IN_LOOP; | 390 HLoopBlockInformation.FOR_IN_LOOP; |
| 391 | 391 |
| 392 @override | 392 @override |
| 393 int visitSwitchStatement(ir.SwitchStatement node) => | 393 int visitSwitchStatement(ir.SwitchStatement node) => |
| 394 HLoopBlockInformation.SWITCH_CONTINUE_LOOP; | 394 HLoopBlockInformation.SWITCH_CONTINUE_LOOP; |
| 395 } | 395 } |
| OLD | NEW |