Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Unified Diff: pkg/compiler/lib/src/js_model/closure.dart

Issue 2981673002: Register created closure class with the world. (Closed)
Patch Set: . Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/closure.dart ('k') | pkg/compiler/lib/src/js_model/closure_visitors.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)';
}
« no previous file with comments | « pkg/compiler/lib/src/closure.dart ('k') | pkg/compiler/lib/src/js_model/closure_visitors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698