| Index: pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
|
| diff --git a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
|
| index fd15e52a7b6e4e8b3dc920f9bc7ebecdc689eb25..b085a564e707c5a535eb95538a420efe91147ebb 100644
|
| --- a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
|
| +++ b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
|
| @@ -60,10 +60,8 @@ class KernelBackendStrategy implements BackendStrategy {
|
| }
|
|
|
| @override
|
| - void convertClosures(ClosedWorldRefiner closedWorldRefiner) {
|
| - // TODO(johnniwinther,efortuna): Compute closure classes for kernel based
|
| - // elements.
|
| - }
|
| + ClosureConversionTask createClosureConversionTask(Compiler compiler) =>
|
| + new KernelClosureConversionTask(compiler.measurer);
|
|
|
| @override
|
| WorkItemBuilder createCodegenWorkItemBuilder(ClosedWorld closedWorld) {
|
| @@ -151,8 +149,8 @@ class KernelSsaBuilderTask extends CompilerTask implements SsaBuilderTask {
|
| closedWorld,
|
| _compiler.codegenWorldBuilder,
|
| work.registry,
|
| + _compiler.closureDataLookup,
|
| // TODO(johnniwinther): Support these:
|
| - const KernelClosureDataLookup(),
|
| const SourceInformationBuilder(),
|
| null, // Function node used as capture scope id.
|
| targetIsConstructorBody: false);
|
| @@ -309,9 +307,32 @@ class KLocal implements Local {
|
| }
|
| }
|
|
|
| -/// TODO(johnniwinther,efortuna): Implement this.
|
| -class KernelClosureDataLookup implements ClosureDataLookup<ir.Node> {
|
| - const KernelClosureDataLookup();
|
| +/// Closure conversion code using our new Entity model. Closure conversion is
|
| +/// necessary because the semantics of closures are slightly different in Dart
|
| +/// than JavaScript. Closure conversion is separated out into two phases:
|
| +/// generation of a new (temporary) representation to store where variables need
|
| +/// to be hoisted/captured up at another level to re-write the closure, and then
|
| +/// the code generation phase where we generate elements and/or instructions to
|
| +/// represent this new code path.
|
| +///
|
| +/// For a general explanation of how closure conversion works at a high level,
|
| +/// check out:
|
| +/// http://siek.blogspot.com/2012/07/essence-of-closure-conversion.html or
|
| +/// http://matt.might.net/articles/closure-conversion/.
|
| +class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
|
| + KernelClosureConversionTask(Measurer measurer) : super(measurer);
|
| +
|
| + /// The combined steps of generating our intermediate representation of
|
| + /// closures that need to be rewritten and generating the element model.
|
| + /// Ultimately these two steps will be split apart with the second step
|
| + /// happening later in compilation just before codegen. These steps are
|
| + /// combined here currently to provide a consistent interface to the rest of
|
| + /// the compiler until we are ready to separate these phases.
|
| + @override
|
| + void convertClosures(Iterable<MemberEntity> processedEntities,
|
| + ClosedWorldRefiner closedWorldRefiner) {
|
| + // TODO(efortuna): implement.
|
| + }
|
|
|
| @override
|
| ClosureAnalysisInfo getClosureAnalysisInfo(ir.Node node) {
|
|
|