Chromium Code Reviews| 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 04611ad1e686c9f951d81e5691bb07bfaafb95ca..88bc909a8091aa117c2dd403119056b2b4ba4b03 100644 |
| --- a/pkg/compiler/lib/src/js_model/closure.dart |
| +++ b/pkg/compiler/lib/src/js_model/closure.dart |
| @@ -31,6 +31,12 @@ 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. |
| + /// This particular map contains ScopeInfos only for entities that are *not* |
| + /// closures. Entities that are closures are stored in the |
| + /// [_closureScopeMap]. |
|
sra1
2017/07/12 23:57:41
Say why are they separate. Is it so these can be G
Emily Fortuna
2017/07/13 21:03:39
see comment below.
|
| + Map<Entity, ScopeInfo> _scopeMap = <Entity, ScopeInfo>{}; |
| Map<ir.Node, ClosureScope> _closureScopeMap = <ir.Node, ClosureScope>{}; |
|
sra1
2017/07/12 23:57:41
Can this be Entity too?
Emily Fortuna
2017/07/13 21:03:39
yes, ended up combining with the above, since thes
|
| Map<Entity, ClosureRepresentationInfo> _closureRepresentationMap = |
| @@ -83,8 +89,12 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
| ClosedWorldRefiner closedWorldRefiner) { |
| ir.Node node = _elementMap.getMemberNode(entity); |
| if (_closureScopeMap.keys.contains(node)) return; |
| - ClosureScopeBuilder translator = new ClosureScopeBuilder(_closureScopeMap, |
| - closuresToGenerate, _globalLocalsMap.getLocalsMap(entity), _elementMap); |
| + ClosureScopeBuilder translator = new ClosureScopeBuilder( |
| + _closureScopeMap, |
| + _scopeMap, |
| + closuresToGenerate, |
| + _globalLocalsMap.getLocalsMap(entity), |
| + _elementMap); |
| if (entity.isField) { |
| if (node is ir.Field && node.initializer != null) { |
| translator.translateLazyInitializer(node); |
| @@ -129,7 +139,15 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
| @override |
| ScopeInfo getScopeInfo(Entity entity) { |
| - return getClosureRepresentationInfo(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); |
| } |
| // TODO(efortuna): Eventually closureScopeMap[node] should always be non-null, |
| @@ -152,13 +170,6 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
| // 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(); |
| } |