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 5fd331f26a8a5342ffafdae9d6bed24d7b411eb1..a02dee2860f63609b55d003df92275520cfcbd65 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
@@ -84,6 +84,10 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
/// fast lookup into class members. |
List<ClassEnv> _classEnvs = <ClassEnv>[]; |
+ /// List of class data by `IndexedClass.classIndex`. This is used for |
+ /// fast lookup into class properties. |
+ List<ClassData> _classData = <ClassData>[]; |
+ |
/// List of member data by `IndexedMember.classIndex`. This is used for |
/// fast lookup into member properties. |
List<MemberData> _memberData = <MemberData>[]; |
@@ -189,28 +193,28 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]); |
InterfaceType _getSuperType(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- return env.supertype; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureSupertypes(cls, data); |
+ return data.supertype; |
} |
- void _ensureThisAndRawType(ClassEntity cls, ClassEnv env) { |
- if (env.thisType == null) { |
- ir.Class node = env.cls; |
+ void _ensureThisAndRawType(ClassEntity cls, ClassData data) { |
+ if (data.thisType == null) { |
+ ir.Class node = data.cls; |
// TODO(johnniwinther): Add the type argument to the list literal when we |
// no longer use resolution types. |
if (node.typeParameters.isEmpty) { |
- env.thisType = |
- env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); |
+ data.thisType = |
+ data.rawType = new InterfaceType(cls, const/*<DartType>*/ []); |
} else { |
- env.thisType = new InterfaceType( |
+ data.thisType = new InterfaceType( |
cls, |
new List/*<DartType>*/ .generate(node.typeParameters.length, |
(int index) { |
return new TypeVariableType( |
_getTypeVariable(node.typeParameters[index])); |
})); |
- env.rawType = new InterfaceType( |
+ data.rawType = new InterfaceType( |
cls, |
new List/*<DartType>*/ .filled( |
node.typeParameters.length, const DynamicType())); |
@@ -223,34 +227,34 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
TypeVariableEntity _getTypeVariable(ir.TypeParameter node); |
- void _ensureSupertypes(ClassEntity cls, ClassEnv env) { |
- if (env.orderedTypeSet == null) { |
- _ensureThisAndRawType(cls, env); |
+ void _ensureSupertypes(ClassEntity cls, ClassData data) { |
+ if (data.orderedTypeSet == null) { |
+ _ensureThisAndRawType(cls, data); |
- ir.Class node = env.cls; |
+ ir.Class node = data.cls; |
if (node.supertype == null) { |
- env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); |
- env.isMixinApplication = false; |
- env.interfaces = const <InterfaceType>[]; |
+ data.orderedTypeSet = new OrderedTypeSet.singleton(data.thisType); |
+ data.isMixinApplication = false; |
+ data.interfaces = const <InterfaceType>[]; |
} else { |
InterfaceType processSupertype(ir.Supertype node) { |
- InterfaceType type = _typeConverter.visitSupertype(node); |
- IndexedClass superclass = type.element; |
- ClassEnv env = _classEnvs[superclass.classIndex]; |
- _ensureSupertypes(superclass, env); |
- return type; |
+ InterfaceType supertype = _typeConverter.visitSupertype(node); |
+ IndexedClass superclass = supertype.element; |
+ ClassData superdata = _classData[superclass.classIndex]; |
+ _ensureSupertypes(superclass, superdata); |
+ return supertype; |
} |
- env.supertype = processSupertype(node.supertype); |
+ data.supertype = processSupertype(node.supertype); |
LinkBuilder<InterfaceType> linkBuilder = |
new LinkBuilder<InterfaceType>(); |
if (node.mixedInType != null) { |
- env.isMixinApplication = true; |
+ data.isMixinApplication = true; |
linkBuilder |
- .addLast(env.mixedInType = processSupertype(node.mixedInType)); |
+ .addLast(data.mixedInType = processSupertype(node.mixedInType)); |
} else { |
- env.isMixinApplication = false; |
+ data.isMixinApplication = false; |
} |
node.implementedTypes.forEach((ir.Supertype supertype) { |
linkBuilder.addLast(processSupertype(supertype)); |
@@ -258,9 +262,9 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
Link<InterfaceType> interfaces = linkBuilder.toLink(); |
OrderedTypeSetBuilder setBuilder = |
new _KernelOrderedTypeSetBuilder(this, cls); |
- env.orderedTypeSet = |
- setBuilder.createOrderedTypeSet(env.supertype, interfaces); |
- env.interfaces = new List<InterfaceType>.from(interfaces.toList()); |
+ data.orderedTypeSet = |
+ setBuilder.createOrderedTypeSet(data.supertype, interfaces); |
+ data.interfaces = new List<InterfaceType>.from(interfaces.toList()); |
} |
} |
} |
@@ -392,15 +396,15 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
InterfaceType _getThisType(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureThisAndRawType(cls, env); |
- return env.thisType; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ return data.thisType; |
} |
InterfaceType _getRawType(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureThisAndRawType(cls, env); |
- return env.rawType; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ return data.rawType; |
} |
FunctionType _getFunctionType(IndexedFunction function) { |
@@ -409,37 +413,36 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
ClassEntity _getAppliedMixin(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- return env.mixedInType?.element; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ return data.mixedInType?.element; |
} |
bool _isMixinApplication(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- return env.isMixinApplication; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ return data.isMixinApplication; |
} |
bool _isUnnamedMixinApplication(IndexedClass cls) { |
ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
return env.isUnnamedMixinApplication; |
} |
void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- env.orderedTypeSet.supertypes.forEach(f); |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ data.orderedTypeSet.supertypes.forEach(f); |
} |
void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) { |
while (cls != null) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- if (env.mixedInType != null) { |
- f(env.mixedInType.element); |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ if (data.mixedInType != null) { |
+ f(data.mixedInType.element); |
} |
- cls = env.supertype?.element; |
+ cls = data.supertype?.element; |
} |
} |
@@ -456,9 +459,10 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
env.forEachMember((ir.Member member) { |
f(cls, getMember(member)); |
}); |
- _ensureSupertypes(cls, env); |
- if (env.supertype != null) { |
- _forEachClassMember(env.supertype.element, f); |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureSupertypes(cls, data); |
+ if (data.supertype != null) { |
+ _forEachClassMember(data.supertype.element, f); |
} |
} |
@@ -483,21 +487,21 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
OrderedTypeSet _getOrderedTypeSet(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- return env.orderedTypeSet; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ return data.orderedTypeSet; |
} |
int _getHierarchyDepth(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- return env.orderedTypeSet.maxDepth; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ return data.orderedTypeSet.maxDepth; |
} |
Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { |
- ClassEnv env = _classEnvs[cls.classIndex]; |
- _ensureSupertypes(cls, env); |
- return env.interfaces; |
+ ClassData data = _classData[cls.classIndex]; |
+ _ensureThisAndRawType(cls, data); |
+ return data.interfaces; |
} |
Spannable _getSpannable(MemberEntity member, ir.Node node) { |
@@ -521,6 +525,7 @@ abstract class ElementCreatorMixin { |
List<LibraryEnv> get _libraryEnvs; |
List<ClassEntity> get _classList; |
List<ClassEnv> get _classEnvs; |
+ List<ClassData> get _classData; |
List<MemberEntity> get _memberList; |
List<MemberData> get _memberData; |
@@ -573,6 +578,7 @@ abstract class ElementCreatorMixin { |
classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); |
} |
_classEnvs.add(classEnv); |
+ _classData.add(new ClassData(node)); |
ClassEntity cls = createClass(library, _classMap.length, node.name, |
isAbstract: node.isAbstract); |
_classList.add(cls); |
@@ -948,7 +954,7 @@ abstract class KernelToElementMapForImpactImpl |
} |
Iterable<ConstantValue> _getClassMetadata(KClass cls) { |
- return _classEnvs[cls.classIndex].getMetadata(this); |
+ return _classData[cls.classIndex].getMetadata(this); |
} |
} |
@@ -1081,12 +1087,12 @@ class KernelElementEnvironment implements ElementEnvironment { |
} |
@override |
- bool isMixinApplication(covariant KClass cls) { |
+ bool isMixinApplication(ClassEntity cls) { |
return elementMap._isMixinApplication(cls); |
} |
@override |
- bool isUnnamedMixinApplication(covariant KClass cls) { |
+ bool isUnnamedMixinApplication(ClassEntity cls) { |
return elementMap._isUnnamedMixinApplication(cls); |
} |
@@ -1214,7 +1220,7 @@ class KernelElementEnvironment implements ElementEnvironment { |
} |
@override |
- void forEachClass(covariant KLibrary library, void f(ClassEntity cls)) { |
+ void forEachClass(LibraryEntity library, void f(ClassEntity cls)) { |
elementMap._forEachClass(library, f); |
} |
@@ -1229,13 +1235,13 @@ class KernelElementEnvironment implements ElementEnvironment { |
} |
@override |
- bool isDeferredLoadLibraryGetter(covariant KMember member) { |
+ bool isDeferredLoadLibraryGetter(MemberEntity member) { |
// TODO(redemption): Support these. |
return false; |
} |
@override |
- Iterable<ConstantValue> getMemberMetadata(covariant KMember member) { |
+ Iterable<ConstantValue> getMemberMetadata(covariant IndexedMember member) { |
MemberData memberData = elementMap._memberData[member.memberIndex]; |
return memberData.getMetadata(elementMap); |
} |
@@ -1712,6 +1718,7 @@ class JsKernelToElementMap extends KernelToElementMapBase |
classIndex < _elementMap._classEnvs.length; |
classIndex++) { |
ClassEnv env = _elementMap._classEnvs[classIndex]; |
+ ClassData data = _elementMap._classData[classIndex]; |
ClassEntity oldClass = _elementMap._classList[classIndex]; |
IndexedLibrary oldLibrary = oldClass.library; |
LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; |
@@ -1719,6 +1726,7 @@ class JsKernelToElementMap extends KernelToElementMapBase |
_classMap[env.cls] = newClass; |
_classList.add(newClass); |
_classEnvs.add(env); |
+ _classData.add(data.copy()); |
} |
for (int memberIndex = 0; |
memberIndex < _elementMap._memberData.length; |
@@ -1732,7 +1740,7 @@ class JsKernelToElementMap extends KernelToElementMapBase |
oldClass != null ? _classList[oldClass.classIndex] : null; |
IndexedMember newMember = convertMember(newLibrary, newClass, oldMember); |
_memberList.add(newMember); |
- _memberData.add(data); |
+ _memberData.add(data.copy()); |
if (newMember.isField) { |
_fieldMap[data.node] = newMember; |
} else if (newMember.isConstructor) { |
@@ -1773,11 +1781,6 @@ class JsKernelToElementMap extends KernelToElementMapBase |
return cls; |
} |
- @override |
- TypeVariableEntity _getTypeVariable(ir.TypeParameter node) { |
- throw new UnsupportedError("JsKernelToElementMap._getTypeVariable"); |
- } |
- |
// TODO(johnniwinther): Reinsert these when [ElementCreatorMixin] is no longer |
// mixed in. |
/*@override |