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(); |
} |