| 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 library kernel.transformations.continuation; | 5 library kernel.transformations.continuation; |
| 6 | 6 |
| 7 import 'dart:math' as math; | 7 import 'dart:math' as math; |
| 8 | 8 |
| 9 import '../ast.dart'; | 9 import '../ast.dart'; |
| 10 import '../core_types.dart'; | 10 import '../core_types.dart'; |
| 11 import '../visitor.dart'; | 11 import '../visitor.dart'; |
| 12 | 12 |
| 13 import 'async.dart'; | 13 import 'async.dart'; |
| 14 | 14 |
| 15 void transformLibraries(CoreTypes coreTypes, List<Library> libraries) { |
| 16 var helper = new HelperNodes.fromCoreTypes(coreTypes); |
| 17 var rewriter = new RecursiveContinuationRewriter(helper); |
| 18 for (var library in libraries) { |
| 19 rewriter.rewriteLibrary(library); |
| 20 } |
| 21 } |
| 22 |
| 15 Program transformProgram(Program program) { | 23 Program transformProgram(Program program) { |
| 16 var helper = new HelperNodes.fromProgram(program); | 24 var helper = new HelperNodes.fromProgram(program); |
| 17 var rewriter = new RecursiveContinuationRewriter(helper); | 25 var rewriter = new RecursiveContinuationRewriter(helper); |
| 18 return rewriter.rewriteProgram(program); | 26 return rewriter.rewriteProgram(program); |
| 19 } | 27 } |
| 20 | 28 |
| 21 class RecursiveContinuationRewriter extends Transformer { | 29 class RecursiveContinuationRewriter extends Transformer { |
| 22 final HelperNodes helper; | 30 final HelperNodes helper; |
| 23 final VariableDeclaration asyncJumpVariable = new VariableDeclaration( | 31 final VariableDeclaration asyncJumpVariable = new VariableDeclaration( |
| 24 ":await_jump_var", | 32 ":await_jump_var", |
| 25 initializer: new IntLiteral(0)); | 33 initializer: new IntLiteral(0)); |
| 26 final VariableDeclaration asyncContextVariable = | 34 final VariableDeclaration asyncContextVariable = |
| 27 new VariableDeclaration(":await_ctx_var"); | 35 new VariableDeclaration(":await_ctx_var"); |
| 28 | 36 |
| 29 RecursiveContinuationRewriter(this.helper); | 37 RecursiveContinuationRewriter(this.helper); |
| 30 | 38 |
| 31 Program rewriteProgram(Program node) { | 39 Program rewriteProgram(Program node) { |
| 32 return node.accept(this); | 40 return node.accept(this); |
| 33 } | 41 } |
| 34 | 42 |
| 43 Library rewriteLibrary(Library node) { |
| 44 return node.accept(this); |
| 45 } |
| 46 |
| 35 visitFunctionNode(FunctionNode node) { | 47 visitFunctionNode(FunctionNode node) { |
| 36 switch (node.asyncMarker) { | 48 switch (node.asyncMarker) { |
| 37 case AsyncMarker.Sync: | 49 case AsyncMarker.Sync: |
| 38 case AsyncMarker.SyncYielding: | 50 case AsyncMarker.SyncYielding: |
| 39 node.transformChildren(new RecursiveContinuationRewriter(helper)); | 51 node.transformChildren(new RecursiveContinuationRewriter(helper)); |
| 40 return node; | 52 return node; |
| 41 case AsyncMarker.SyncStar: | 53 case AsyncMarker.SyncStar: |
| 42 return new SyncStarFunctionRewriter(helper, node).rewrite(); | 54 return new SyncStarFunctionRewriter(helper, node).rewrite(); |
| 43 case AsyncMarker.Async: | 55 case AsyncMarker.Async: |
| 44 return new AsyncFunctionRewriter(helper, node).rewrite(); | 56 return new AsyncFunctionRewriter(helper, node).rewrite(); |
| (...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 this.completerConstructor, | 917 this.completerConstructor, |
| 906 this.syncIterableConstructor, | 918 this.syncIterableConstructor, |
| 907 this.streamIteratorConstructor, | 919 this.streamIteratorConstructor, |
| 908 this.futureMicrotaskConstructor, | 920 this.futureMicrotaskConstructor, |
| 909 this.streamControllerConstructor, | 921 this.streamControllerConstructor, |
| 910 this.asyncThenWrapper, | 922 this.asyncThenWrapper, |
| 911 this.asyncErrorWrapper, | 923 this.asyncErrorWrapper, |
| 912 this.awaitHelper, | 924 this.awaitHelper, |
| 913 this.coreTypes); | 925 this.coreTypes); |
| 914 | 926 |
| 915 factory HelperNodes.fromProgram(Program program) { | 927 factory HelperNodes.fromCoreTypes(CoreTypes coreTypes) { |
| 916 var coreTypes = new CoreTypes(program); | |
| 917 return new HelperNodes( | 928 return new HelperNodes( |
| 918 coreTypes.asyncLibrary, | 929 coreTypes.asyncLibrary, |
| 919 coreTypes.coreLibrary, | 930 coreTypes.coreLibrary, |
| 920 coreTypes.iteratorClass, | 931 coreTypes.iteratorClass, |
| 921 coreTypes.futureClass, | 932 coreTypes.futureClass, |
| 922 coreTypes.futureOrClass, | 933 coreTypes.futureOrClass, |
| 923 coreTypes.completerClass, | 934 coreTypes.completerClass, |
| 924 coreTypes.printProcedure, | 935 coreTypes.printProcedure, |
| 925 coreTypes.completerSyncConstructor, | 936 coreTypes.completerSyncConstructor, |
| 926 coreTypes.syncIterableDefaultConstructor, | 937 coreTypes.syncIterableDefaultConstructor, |
| 927 coreTypes.streamIteratorDefaultConstructor, | 938 coreTypes.streamIteratorDefaultConstructor, |
| 928 coreTypes.futureMicrotaskConstructor, | 939 coreTypes.futureMicrotaskConstructor, |
| 929 coreTypes.asyncStarStreamControllerDefaultConstructor, | 940 coreTypes.asyncStarStreamControllerDefaultConstructor, |
| 930 coreTypes.asyncThenWrapperHelperProcedure, | 941 coreTypes.asyncThenWrapperHelperProcedure, |
| 931 coreTypes.asyncErrorWrapperHelperProcedure, | 942 coreTypes.asyncErrorWrapperHelperProcedure, |
| 932 coreTypes.awaitHelperProcedure, | 943 coreTypes.awaitHelperProcedure, |
| 933 coreTypes); | 944 coreTypes); |
| 934 } | 945 } |
| 946 |
| 947 factory HelperNodes.fromProgram(Program program) { |
| 948 var coreTypes = new CoreTypes(program); |
| 949 return new HelperNodes.fromCoreTypes(coreTypes); |
| 950 } |
| 935 } | 951 } |
| OLD | NEW |