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

Unified Diff: pkg/compiler/lib/src/kernel/element_map_impl.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/js_model/js_strategy.dart ('k') | pkg/compiler/lib/src/kernel/env.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 12dc109b3899a1f3e0b39faea30edc6b0cee47a2..2d0056da1546aa35f81720f2707363b9076514f7 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -28,6 +28,7 @@ import '../js_backend/interceptor_data.dart';
import '../js_backend/native_data.dart';
import '../js_backend/no_such_method_registry.dart';
import '../js_backend/runtime_types.dart';
+import '../js_model/closure.dart';
import '../js_model/elements.dart';
import '../native/enqueue.dart';
import '../native/native.dart' as native;
@@ -656,6 +657,28 @@ abstract class ElementCreatorMixin {
});
}
+ 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);
+ 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>());
+ // 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);
@@ -664,7 +687,7 @@ abstract class ElementCreatorMixin {
}
_classEnvs.add(classEnv);
_classData.add(new ClassData(node));
- ClassEntity cls = createClass(library, _classMap.length, node.name,
+ ClassEntity cls = createClass(library, _classList.length, node.name,
isAbstract: node.isAbstract);
_classList.add(cls);
return cls;
@@ -1536,7 +1559,7 @@ abstract class KernelClosedWorldMixin implements ClosedWorldBase {
@override
ClassEntity getSuperClass(ClassEntity cls) {
- throw new UnimplementedError('KernelClosedWorldMixin.getSuperClass');
+ return elementMap._getSuperType(cls)?.element;
}
@override
@@ -1606,8 +1629,32 @@ class KernelClosedWorld extends ClosedWorldBase
}
@override
- void registerClosureClass(ClassElement cls) {
- throw new UnimplementedError('KernelClosedWorld.registerClosureClass');
+ void registerClosureClass(ClassEntity cls, bool fromInstanceMember) {
+ // Tell the hierarchy that this is the super class. then we can use
+ // .getSupertypes(class)
+ IndexedClass superclass = fromInstanceMember
+ ? commonElements.boundClosureClass
+ : commonElements.closureClass;
+ ClassHierarchyNode parentNode = getClassHierarchyNode(superclass);
+ ClassHierarchyNode node = new ClassHierarchyNode(
+ parentNode, cls, getHierarchyDepth(superclass) + 1);
+ addClassHierarchyNode(cls, node);
+ for (InterfaceType type in getOrderedTypeSet(superclass).types) {
+ // TODO(efortuna): assert that the FunctionClass is in this ordered set.
+ // If not, we need to explicitly add node as a subtype of FunctionClass.
+ ClassSet subtypeSet = getClassSet(type.element);
+ subtypeSet.addSubtype(node);
+ }
+ addClassSet(cls, new ClassSet(node));
+
+ // Ensure that the supertype's hierarchy is completely set up.
+ var supertype = new InterfaceType(superclass, const []);
+ ClassData superdata = elementMap._classData[superclass.classIndex];
+ elementMap._ensureSupertypes(superclass, superdata);
+ elementMap._ensureThisAndRawType(superclass, superdata);
+
+ elementMap.addClosureClass(cls, supertype);
+ node.isDirectlyInstantiated = true;
}
}
« no previous file with comments | « pkg/compiler/lib/src/js_model/js_strategy.dart ('k') | pkg/compiler/lib/src/kernel/env.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698