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

Unified Diff: pkg/compiler/lib/src/kernel/element_map_impl.dart

Issue 2984263002: Make the ClosedWorld build the closure class on the kernel side. (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/kernel/element_map.dart ('k') | pkg/compiler/lib/src/ssa/builder_kernel.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/element_map_impl.dart
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index cd79f0ee020facdc6aea9e6d5fa3058adc1cb75c..c8c9e06f20ba1ec4d60fdc357d080617c98bf7b6 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -663,38 +663,6 @@ abstract class ElementCreatorMixin {
});
}
- // TODO(johnniwinther,efortuna): Create the class index and data together with
- // the [KernelClosureClass].
- void addClosureClass(KernelClosureClass cls, InterfaceType supertype) {
- cls.classIndex = _classEnvs.length;
- _classEnvs.add(new ClassEnv.closureClass());
- _classList.add(cls);
-
- // Create a classData and set up the interfaces and subclass
- // relationships that _ensureSupertypes and _ensureThisAndRawType are doing
- var closureData =
- new ClassData(null, new ClosureClassDefinition(cls, cls.location));
- closureData
- ..isMixinApplication = false
- ..thisType =
- closureData.rawType = new InterfaceType(cls, const/*<DartType>*/ [])
- ..supertype = supertype
- ..interfaces = const <InterfaceType>[];
- var setBuilder =
- new _KernelOrderedTypeSetBuilder((this as KernelToElementMapBase), cls);
- _classData.add(closureData);
- closureData.orderedTypeSet = setBuilder.createOrderedTypeSet(
- closureData.supertype, const Link<InterfaceType>());
-
- cls.forEachCapturedVariable((Local local, JField field) {
- field.setClosureMemberIndex = _memberData.length;
- // TODO(efortuna): Uncomment this line after Johnni's added in his CL
- // about Class/MemberDefinition.
- //_memberData.add(field);
- });
- // TODO(efortuna): Does getMetadata get called in ClassData for this object?
- }
-
ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) {
return _classMap.putIfAbsent(node, () {
KLibrary library = _getLibrary(node.enclosingLibrary);
@@ -1997,6 +1965,87 @@ class JsKernelToElementMap extends KernelToElementMapBase
});
}
+ KernelClosureClass constructClosureClass(
+ String name,
+ JLibrary enclosingLibrary,
+ KernelScopeInfo info,
+ ir.Location location,
+ KernelToLocalsMap localsMap,
+ InterfaceType supertype) {
+ KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(
+ name, _classEnvs.length, enclosingLibrary, info, location, localsMap);
+ _classList.add(cls);
+ _classEnvs.add(new ClassEnv.closureClass());
+
+ // Create a classData and set up the interfaces and subclass
+ // relationships that _ensureSupertypes and _ensureThisAndRawType are doing
+ var closureData =
+ new ClassData(null, new ClosureClassDefinition(cls, cls.location));
+ closureData
+ ..isMixinApplication = false
+ ..thisType =
+ closureData.rawType = new InterfaceType(cls, const/*<DartType>*/ [])
+ ..supertype = supertype
+ ..interfaces = const <InterfaceType>[];
+ var setBuilder = new _KernelOrderedTypeSetBuilder(this, cls);
+ _classData.add(closureData);
+ closureData.orderedTypeSet = setBuilder.createOrderedTypeSet(
+ closureData.supertype, const Link<InterfaceType>());
+
+ int i = 0;
+ for (ir.VariableDeclaration variable in info.freeVariables) {
+ // Make a corresponding field entity in this closure class for every
+ // single freeVariable in the KernelScopeInfo.freeVariable.
+ _constructClosureFields(cls, variable, i, localsMap);
+ i++;
+ }
+
+ // TODO(efortuna): Does getMetadata get called in ClassData for this object?
+ return cls;
+ }
+
+ _constructClosureFields(
+ KernelClosureClass cls,
+ ir.VariableDeclaration variable,
+ int fieldNumber,
+ KernelToLocalsMap localsMap) {
+ // NOTE: This construction order may be slightly different than the
+ // old Element version. The old version did all the boxed items and then
+ // all the others.
+ Local capturedLocal = localsMap.getLocalVariable(variable);
+ if (cls.isBoxed(capturedLocal)) {
+ // TODO(efortuna): Coming soon.
+ } else {
+ var closureField = new ClosureField(
+ _getClosureVariableName(capturedLocal.name, fieldNumber),
+ _memberData.length,
+ cls,
+ variable.isConst,
+ variable.isFinal || variable.isConst);
+ cls.localToFieldMap[capturedLocal] = closureField;
+ _memberList.add(closureField);
+ _memberData.add(new MemberData(
+ null,
+ new ClosureMemberDefinition(cls.localToFieldMap[capturedLocal],
+ variable.location, MemberKind.closureField, variable)));
+ }
+ }
+
+ /// Generate a unique name for the [id]th closure field, with proposed name
+ /// [name].
+ ///
+ /// The result is used as the name of [ClosureFieldElement]s, and must
+ /// therefore be unique to avoid breaking an invariant in the element model
+ /// (classes cannot declare multiple fields with the same name).
+ ///
+ /// Also, the names should be distinct from real field names to prevent
+ /// clashes with selectors for those fields.
+ ///
+ /// These names are not used in generated code, just as element name.
+ String _getClosureVariableName(String name, int id) {
+ return "_captured_${name}_$id";
+ }
+
String getDeferredUri(ir.LibraryDependency node) {
throw new UnimplementedError('JsKernelToElementMap.getDeferredUri');
}
« no previous file with comments | « pkg/compiler/lib/src/kernel/element_map.dart ('k') | pkg/compiler/lib/src/ssa/builder_kernel.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698