| Index: pkg/compiler/lib/src/kernel/closure.dart
|
| diff --git a/pkg/compiler/lib/src/kernel/closure.dart b/pkg/compiler/lib/src/kernel/closure.dart
|
| deleted file mode 100644
|
| index 3268808c514a6286d7770947c4a9fca9f136ce17..0000000000000000000000000000000000000000
|
| --- a/pkg/compiler/lib/src/kernel/closure.dart
|
| +++ /dev/null
|
| @@ -1,154 +0,0 @@
|
| -// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -import 'package:kernel/ast.dart' as ir;
|
| -
|
| -import '../closure.dart';
|
| -import '../common/tasks.dart';
|
| -import '../elements/entities.dart';
|
| -import '../world.dart';
|
| -import 'element_map.dart';
|
| -import 'kernel_backend_strategy.dart';
|
| -
|
| -class KernelClosureDataBuilder extends ir.Visitor {
|
| - final KernelToLocalsMap _localsMap;
|
| - final KernelClosureRepresentationInfo info;
|
| -
|
| - bool _inTry = false;
|
| -
|
| - KernelClosureDataBuilder(this._localsMap, ThisLocal thisLocal)
|
| - : info = new KernelClosureRepresentationInfo(thisLocal);
|
| -
|
| - @override
|
| - defaultNode(ir.Node node) {
|
| - node.visitChildren(this);
|
| - }
|
| -
|
| - @override
|
| - visitTryCatch(ir.TryCatch node) {
|
| - bool oldInTry = _inTry;
|
| - _inTry = true;
|
| - node.visitChildren(this);
|
| - _inTry = oldInTry;
|
| - }
|
| -
|
| - @override
|
| - visitTryFinally(ir.TryFinally node) {
|
| - bool oldInTry = _inTry;
|
| - _inTry = true;
|
| - node.visitChildren(this);
|
| - _inTry = oldInTry;
|
| - }
|
| -
|
| - @override
|
| - visitVariableGet(ir.VariableGet node) {
|
| - if (_inTry) {
|
| - info.registerUsedInTryOrSync(_localsMap.getLocal(node.variable));
|
| - }
|
| - }
|
| -
|
| - @override
|
| - visitVariableSet(ir.VariableSet node) {
|
| - if (_inTry) {
|
| - info.registerUsedInTryOrSync(_localsMap.getLocal(node.variable));
|
| - }
|
| - node.visitChildren(this);
|
| - }
|
| -}
|
| -
|
| -/// 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> {
|
| - final KernelToElementMapForBuilding _elementMap;
|
| - final GlobalLocalsMap _globalLocalsMap;
|
| - Map<Entity, ClosureRepresentationInfo> _infoMap =
|
| - <Entity, ClosureRepresentationInfo>{};
|
| -
|
| - KernelClosureConversionTask(
|
| - Measurer measurer, this._elementMap, this._globalLocalsMap)
|
| - : 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.
|
| - }
|
| -
|
| - /// TODO(johnniwinther,efortuna): Implement this.
|
| - @override
|
| - ClosureScope getClosureScope(ir.Node node) {
|
| - return const ClosureScope();
|
| - }
|
| -
|
| - @override
|
| - ScopeInfo getScopeInfo(Entity entity) {
|
| - // TODO(efortuna): Specialize this function from the one below.
|
| - return getClosureRepresentationInfo(entity);
|
| - }
|
| -
|
| - /// TODO(johnniwinther,efortuna): Implement this.
|
| - @override
|
| - LoopClosureScope getLoopClosureScope(ir.Node loopNode) {
|
| - return const LoopClosureScope();
|
| - }
|
| -
|
| - @override
|
| - ClosureRepresentationInfo getClosureRepresentationInfo(Entity entity) {
|
| - return _infoMap.putIfAbsent(entity, () {
|
| - if (entity is MemberEntity) {
|
| - ir.Member node = _elementMap.getMemberNode(entity);
|
| - ThisLocal thisLocal;
|
| - if (entity.isInstanceMember) {
|
| - thisLocal = new ThisLocal(entity);
|
| - }
|
| - KernelClosureDataBuilder builder = new KernelClosureDataBuilder(
|
| - _globalLocalsMap.getLocalsMap(entity), thisLocal);
|
| - node.accept(builder);
|
| - return builder.info;
|
| - }
|
| -
|
| - /// TODO(johnniwinther,efortuna): Implement this.
|
| - return const ClosureRepresentationInfo();
|
| - });
|
| - }
|
| -}
|
| -
|
| -// TODO(johnniwinther): Add unittest for the computed
|
| -// [ClosureRepresentationInfo].
|
| -class KernelClosureRepresentationInfo extends ClosureRepresentationInfo {
|
| - final ThisLocal thisLocal;
|
| - final Set<Local> _localsUsedInTryOrSync = new Set<Local>();
|
| -
|
| - KernelClosureRepresentationInfo(this.thisLocal);
|
| -
|
| - void registerUsedInTryOrSync(Local local) {
|
| - _localsUsedInTryOrSync.add(local);
|
| - }
|
| -
|
| - bool variableIsUsedInTryOrSync(Local variable) =>
|
| - _localsUsedInTryOrSync.contains(variable);
|
| -
|
| - String toString() {
|
| - StringBuffer sb = new StringBuffer();
|
| - sb.write('this=$thisLocal,');
|
| - sb.write('localsUsedInTryOrSync={${_localsUsedInTryOrSync.join(', ')}}');
|
| - return sb.toString();
|
| - }
|
| -}
|
|
|