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 042568b095d6f19a21f2f4f1b036c8ae0b9c42cc..04611ad1e686c9f951d81e5691bb07bfaafb95ca 100644 |
--- a/pkg/compiler/lib/src/js_model/closure.dart |
+++ b/pkg/compiler/lib/src/js_model/closure.dart |
@@ -54,7 +54,7 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
@override |
void convertClosures(Iterable<MemberEntity> processedEntities, |
ClosedWorldRefiner closedWorldRefiner) { |
- var closuresToGenerate = <ir.Node, ScopeInfo>{}; |
+ var closuresToGenerate = <ir.TreeNode, ScopeInfo>{}; |
processedEntities.forEach((MemberEntity kEntity) { |
MemberEntity entity = kEntity; |
if (_kToJElementMap != null) { |
@@ -69,7 +69,7 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
_buildClosureModel(entity, closuresToGenerate, closedWorldRefiner); |
}); |
- for (ir.Node node in closuresToGenerate.keys) { |
+ for (ir.TreeNode node in closuresToGenerate.keys) { |
_produceSyntheticElements( |
node, closuresToGenerate[node], closedWorldRefiner); |
} |
@@ -79,7 +79,7 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
/// be marked as free variables. |
void _buildClosureModel( |
MemberEntity entity, |
- Map<ir.Node, ScopeInfo> closuresToGenerate, |
+ Map<ir.TreeNode, ScopeInfo> closuresToGenerate, |
ClosedWorldRefiner closedWorldRefiner) { |
ir.Node node = _elementMap.getMemberNode(entity); |
if (_closureScopeMap.keys.contains(node)) return; |
@@ -99,7 +99,9 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
/// with fields containing the captured variables to replicate the Dart |
/// closure semantics in JS. |
void _produceSyntheticElements( |
- ir.Node node, ScopeInfo info, ClosedWorldRefiner closedWorldRefiner) { |
+ ir.TreeNode /* ir.Field | ir.FunctionNode */ node, |
+ ScopeInfo info, |
+ ClosedWorldRefiner closedWorldRefiner) { |
Entity entity; |
KernelClosureClass closureClass = |
new KernelClosureClass.fromScopeInfo(info); |
@@ -119,6 +121,10 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> { |
assert(entity != null); |
_closureRepresentationMap[entity] = closureClass; |
+ |
+ // Register that a new class has been created. |
+ closedWorldRefiner.registerClosureClass( |
+ closureClass, node is ir.Member && node.isInstanceMember); |
} |
@override |
@@ -220,15 +226,23 @@ class KernelLoopClosureScope extends KernelClosureScope |
// TODO(johnniwinther): Add unittest for the computed [ClosureClass]. |
class KernelClosureClass extends KernelScopeInfo |
- implements ClosureRepresentationInfo { |
- KernelClosureClass.fromScopeInfo(ScopeInfo info) |
+ implements ClosureRepresentationInfo, JClass { |
+ // TODO(efortuna): Generate unique name for each closure class. |
+ final String name = 'ClosureClass'; |
+ |
+ /// Index into the classData, classList and classEnvironment lists where this |
+ /// entity is stored in [JsToFrontendMapImpl]. |
+ int classIndex; |
+ |
+ final Map<Local, JField> localToFieldMap = new Map<Local, JField>(); |
+ |
+ KernelClosureClass.fromScopeInfo(KernelScopeInfo info) |
: super.from(info.thisLocal, info); |
// TODO(efortuna): Implement. |
Local get closureEntity => null; |
- // TODO(efortuna): Implement. |
- ClassEntity get closureClassEntity => null; |
+ ClassEntity get closureClassEntity => this; |
// TODO(efortuna): Implement. |
FunctionEntity get callMethod => null; |
@@ -258,4 +272,11 @@ class KernelClosureClass extends KernelScopeInfo |
// ClosedWorldRefiner, which currently only takes elements. The change to |
// that (and the subsequent adjustment here) will follow soon. |
bool get isClosure => false; |
+ |
+ bool get isAbstract => false; |
+ |
+ // TODO(efortuna): Talk to Johnni. |
+ JLibrary get library => null; |
+ |
+ String toString() => '${jsElementPrefix}class($name)'; |
} |