| Index: pkg/compiler/lib/src/js_model/closure.dart
|
| diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
|
| index 7f103bc1c1c049154fbb5da6771f47e30ea88a15..04611ad1e686c9f951d81e5691bb07bfaafb95ca 100644
|
| --- a/pkg/compiler/lib/src/js_model/closure.dart
|
| +++ b/pkg/compiler/lib/src/js_model/closure.dart
|
| @@ -31,11 +31,7 @@ import 'locals.dart';
|
| class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
|
| final KernelToElementMapForBuilding _elementMap;
|
| final GlobalLocalsMap _globalLocalsMap;
|
| -
|
| - /// Map of the scoping information that corresponds to a particular entity.
|
| - Map<Entity, ScopeInfo> _scopeMap = <Entity, ScopeInfo>{};
|
| - Map<ir.Statement, LoopClosureScope> _loopClosureScopeMap =
|
| - <ir.Statement, LoopClosureScope>{};
|
| + Map<ir.Node, ClosureScope> _closureScopeMap = <ir.Node, ClosureScope>{};
|
|
|
| Map<Entity, ClosureRepresentationInfo> _closureRepresentationMap =
|
| <Entity, ClosureRepresentationInfo>{};
|
| @@ -85,17 +81,10 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
|
| MemberEntity entity,
|
| Map<ir.TreeNode, ScopeInfo> closuresToGenerate,
|
| ClosedWorldRefiner closedWorldRefiner) {
|
| - if (_scopeMap.keys.contains(entity)) return;
|
| ir.Node node = _elementMap.getMemberNode(entity);
|
| - if (node is ir.Statement && _loopClosureScopeMap.keys.contains(node))
|
| - return;
|
| - ClosureScopeBuilder translator = new ClosureScopeBuilder(
|
| - _loopClosureScopeMap,
|
| - _scopeMap,
|
| - entity,
|
| - closuresToGenerate,
|
| - _globalLocalsMap.getLocalsMap(entity),
|
| - _elementMap);
|
| + if (_closureScopeMap.keys.contains(node)) return;
|
| + ClosureScopeBuilder translator = new ClosureScopeBuilder(_closureScopeMap,
|
| + closuresToGenerate, _globalLocalsMap.getLocalsMap(entity), _elementMap);
|
| if (entity.isField) {
|
| if (node is ir.Field && node.initializer != null) {
|
| translator.translateLazyInitializer(node);
|
| @@ -140,33 +129,36 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
|
|
|
| @override
|
| ScopeInfo getScopeInfo(Entity entity) {
|
| - // TODO(johnniwinther): Remove this check when constructor bodies a created
|
| - // eagerly with the J-model; a constructor body should have it's own
|
| - // [ClosureRepresentationInfo].
|
| - if (entity is ConstructorBodyEntity) {
|
| - ConstructorBodyEntity constructorBody = entity;
|
| - entity = constructorBody.constructor;
|
| - }
|
| -
|
| - return _scopeMap[entity] ?? getClosureRepresentationInfo(entity);
|
| + return getClosureRepresentationInfo(entity);
|
| }
|
|
|
| // TODO(efortuna): Eventually closureScopeMap[node] should always be non-null,
|
| // and we should just test that with an assert.
|
| + ClosureScope _getClosureScope(ir.Node node) =>
|
| + _closureScopeMap[node] ?? const ClosureScope();
|
| +
|
| @override
|
| - ClosureScope getClosureScope(MemberEntity entity) =>
|
| - _scopeMap[entity] ?? const ClosureScope();
|
| + ClosureScope getClosureScope(MemberEntity entity) {
|
| + return _getClosureScope(_elementMap.getMemberNode(entity));
|
| + }
|
|
|
| @override
|
| // TODO(efortuna): Eventually closureScopeMap[node] should always be non-null,
|
| // and we should just test that with an assert.
|
| - LoopClosureScope getLoopClosureScope(ir.Statement loopNode) =>
|
| - _loopClosureScopeMap[loopNode] ?? const LoopClosureScope();
|
| + LoopClosureScope getLoopClosureScope(ir.Node loopNode) =>
|
| + _closureScopeMap[loopNode] ?? const LoopClosureScope();
|
|
|
| @override
|
| // TODO(efortuna): Eventually closureRepresentationMap[node] should always be
|
| // non-null, and we should just test that with an assert.
|
| ClosureRepresentationInfo getClosureRepresentationInfo(Entity entity) {
|
| + // TODO(johnniwinther): Remove this check when constructor bodies a created
|
| + // eagerly with the J-model; a constructor body should have it's own
|
| + // [ClosureRepresentationInfo].
|
| + if (entity is ConstructorBodyEntity) {
|
| + ConstructorBodyEntity constructorBody = entity;
|
| + entity = constructorBody.constructor;
|
| + }
|
| return _closureRepresentationMap[entity] ??
|
| const ClosureRepresentationInfo();
|
| }
|
|
|