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 33080a3801822d79ff58cdc0e61a49a84e77273b..83fd502a2324c3445183facc5a2ffb46f1a8c01e 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
@@ -27,10 +27,13 @@ import '../js_backend/constant_system_javascript.dart'; |
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/elements.dart'; |
+import '../native/enqueue.dart'; |
import '../native/native.dart' as native; |
import '../native/resolver.dart'; |
import '../ordered_typeset.dart'; |
+import '../options.dart'; |
import '../universe/class_set.dart'; |
import '../universe/selector.dart'; |
import '../universe/world_builder.dart'; |
@@ -100,6 +103,8 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
_types = new _KernelDartTypes(this); |
} |
+ bool checkFamily(Entity entity); |
+ |
DartTypes get types => _types; |
@override |
@@ -127,12 +132,14 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
String _getLibraryName(IndexedLibrary library) { |
+ assert(checkFamily(library)); |
LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
return libraryEnv.library.name ?? ''; |
} |
MemberEntity lookupLibraryMember(IndexedLibrary library, String name, |
{bool setter: false}) { |
+ assert(checkFamily(library)); |
LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
ir.Member member = libraryEnv.lookupMember(name, setter: setter); |
return member != null ? getMember(member) : null; |
@@ -140,6 +147,7 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
void _forEachLibraryMember( |
IndexedLibrary library, void f(MemberEntity member)) { |
+ assert(checkFamily(library)); |
LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
libraryEnv.forEachMember((ir.Member node) { |
f(getMember(node)); |
@@ -147,6 +155,7 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
ClassEntity lookupClass(IndexedLibrary library, String name) { |
+ assert(checkFamily(library)); |
LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
ClassEnv classEnv = libraryEnv.lookupClass(name); |
if (classEnv != null) { |
@@ -156,6 +165,7 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
void _forEachClass(IndexedLibrary library, void f(ClassEntity cls)) { |
+ assert(checkFamily(library)); |
LibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; |
libraryEnv.forEachClass((ClassEnv classEnv) { |
if (!classEnv.isUnnamedMixinApplication) { |
@@ -166,12 +176,14 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
MemberEntity lookupClassMember(IndexedClass cls, String name, |
{bool setter: false}) { |
+ assert(checkFamily(cls)); |
ClassEnv classEnv = _classEnvs[cls.classIndex]; |
ir.Member member = classEnv.lookupMember(name, setter: setter); |
return member != null ? getMember(member) : null; |
} |
ConstructorEntity lookupConstructor(IndexedClass cls, String name) { |
+ assert(checkFamily(cls)); |
ClassEnv classEnv = _classEnvs[cls.classIndex]; |
ir.Member member = classEnv.lookupConstructor(name); |
return member != null ? getConstructor(member) : null; |
@@ -193,12 +205,14 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]); |
InterfaceType _getSuperType(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
return data.supertype; |
} |
void _ensureThisAndRawType(ClassEntity cls, ClassData data) { |
+ assert(checkFamily(cls)); |
if (data.thisType == null) { |
ir.Class node = data.cls; |
// TODO(johnniwinther): Add the type argument to the list literal when we |
@@ -228,6 +242,7 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
TypeVariableEntity _getTypeVariable(ir.TypeParameter node); |
void _ensureSupertypes(ClassEntity cls, ClassData data) { |
+ assert(checkFamily(cls)); |
if (data.orderedTypeSet == null) { |
_ensureThisAndRawType(cls, data); |
@@ -396,46 +411,54 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
InterfaceType _getThisType(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureThisAndRawType(cls, data); |
return data.thisType; |
} |
InterfaceType _getRawType(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureThisAndRawType(cls, data); |
return data.rawType; |
} |
FunctionType _getFunctionType(IndexedFunction function) { |
+ assert(checkFamily(function)); |
FunctionData data = _memberData[function.memberIndex]; |
return data.getFunctionType(this); |
} |
ClassEntity _getAppliedMixin(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
return data.mixedInType?.element; |
} |
bool _isMixinApplication(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
return data.isMixinApplication; |
} |
bool _isUnnamedMixinApplication(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassEnv env = _classEnvs[cls.classIndex]; |
return env.isUnnamedMixinApplication; |
} |
void _forEachSupertype(IndexedClass cls, void f(InterfaceType supertype)) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
data.orderedTypeSet.supertypes.forEach(f); |
} |
void _forEachMixin(IndexedClass cls, void f(ClassEntity mixin)) { |
+ assert(checkFamily(cls)); |
while (cls != null) { |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
@@ -447,6 +470,7 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) { |
+ assert(checkFamily(cls)); |
ClassEnv env = _classEnvs[cls.classIndex]; |
env.forEachConstructor((ir.Member member) { |
f(getConstructor(member)); |
@@ -455,6 +479,7 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
void _forEachClassMember( |
IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { |
+ assert(checkFamily(cls)); |
ClassEnv env = _classEnvs[cls.classIndex]; |
env.forEachMember((ir.Member member) { |
f(cls, getMember(member)); |
@@ -467,16 +492,19 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) { |
+ assert(checkFamily(constructor)); |
ConstructorData data = _memberData[constructor.memberIndex]; |
return data.getConstructorConstant(this, constructor); |
} |
ConstantExpression _getFieldConstant(IndexedField field) { |
+ assert(checkFamily(field)); |
FieldData data = _memberData[field.memberIndex]; |
return data.getFieldConstant(this, field); |
} |
InterfaceType _asInstanceOf(InterfaceType type, ClassEntity cls) { |
+ assert(checkFamily(cls)); |
OrderedTypeSet orderedTypeSet = _getOrderedTypeSet(type.element); |
InterfaceType supertype = |
orderedTypeSet.asInstanceOf(cls, _getHierarchyDepth(cls)); |
@@ -487,18 +515,21 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
OrderedTypeSet _getOrderedTypeSet(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
return data.orderedTypeSet; |
} |
int _getHierarchyDepth(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
return data.orderedTypeSet.maxDepth; |
} |
Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { |
+ assert(checkFamily(cls)); |
ClassData data = _classData[cls.classIndex]; |
_ensureSupertypes(cls, data); |
return data.interfaces; |
@@ -509,10 +540,12 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
ir.Member _getMemberNode(covariant IndexedMember member) { |
+ assert(checkFamily(member)); |
return _memberData[member.memberIndex].node; |
} |
ir.Class _getClassNode(covariant IndexedClass cls) { |
+ assert(checkFamily(cls)); |
return _classEnvs[cls.classIndex].cls; |
} |
} |
@@ -980,6 +1013,15 @@ class KernelToElementMapForImpactImpl2 extends KernelToElementMapBase |
KernelToElementMapForImpactImpl2( |
DiagnosticReporter reporter, Environment environment) |
: super(reporter, environment); |
+ |
+ @override |
+ bool checkFamily(Entity entity) { |
+ assert( |
+ '$entity'.startsWith(kElementPrefix), |
+ failedAt(entity, |
+ "Unexpected entity $entity, expected family $kElementPrefix.")); |
+ return true; |
+ } |
} |
abstract class KernelToElementMapForBuildingFromBaseMixin |
@@ -1025,6 +1067,15 @@ class KernelToElementMapForBuildingImpl extends KernelToElementMapBase |
DiagnosticReporter reporter, Environment environment) |
: super(reporter, environment); |
+ @override |
+ bool checkFamily(Entity entity) { |
+ assert( |
+ '$entity'.startsWith(kElementPrefix), |
+ failedAt(entity, |
+ "Unexpected entity $entity, expected family $kElementPrefix.")); |
+ return true; |
+ } |
+ |
ConstantEnvironment get constantEnvironment => _constantEnvironment; |
ir.Library getKernelLibrary(KLibrary entity) => |
@@ -1431,13 +1482,17 @@ class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { |
final KernelToElementMapForImpactImpl elementMap; |
KernelResolutionWorldBuilder( |
+ CompilerOptions options, |
this.elementMap, |
NativeBasicData nativeBasicData, |
NativeDataBuilder nativeDataBuilder, |
InterceptorDataBuilder interceptorDataBuilder, |
BackendUsageBuilder backendUsageBuilder, |
+ RuntimeTypesNeedBuilder rtiNeedBuilder, |
+ NativeResolutionEnqueuer nativeResolutionEnqueuer, |
SelectorConstraintsStrategy selectorConstraintsStrategy) |
: super( |
+ options, |
elementMap.elementEnvironment, |
elementMap.types, |
elementMap.commonElements, |
@@ -1446,6 +1501,8 @@ class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { |
nativeDataBuilder, |
interceptorDataBuilder, |
backendUsageBuilder, |
+ rtiNeedBuilder, |
+ nativeResolutionEnqueuer, |
selectorConstraintsStrategy); |
@override |
@@ -1547,18 +1604,23 @@ abstract class KernelClosedWorldMixin implements ClosedWorldBase { |
bool checkEntity(Entity element) => true; |
} |
-class KernelClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin { |
+class KernelClosedWorld extends ClosedWorldBase |
+ with KernelClosedWorldMixin, ClosedWorldRtiNeedMixin { |
final KernelToElementMapForImpactImpl elementMap; |
KernelClosedWorld(this.elementMap, |
- {ElementEnvironment elementEnvironment, |
+ {CompilerOptions options, |
+ ElementEnvironment elementEnvironment, |
DartTypes dartTypes, |
CommonElements commonElements, |
ConstantSystem constantSystem, |
NativeData nativeData, |
InterceptorData interceptorData, |
BackendUsage backendUsage, |
+ ResolutionWorldBuilder resolutionWorldBuilder, |
+ RuntimeTypesNeedBuilder rtiNeedBuilder, |
Set<ClassEntity> implementedClasses, |
+ Iterable<ClassEntity> liveNativeClasses, |
Iterable<MemberEntity> liveInstanceMembers, |
Iterable<MemberEntity> assignedInstanceMembers, |
Set<TypedefElement> allTypedefs, |
@@ -1575,13 +1637,17 @@ class KernelClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin { |
interceptorData, |
backendUsage, |
implementedClasses, |
+ liveNativeClasses, |
liveInstanceMembers, |
assignedInstanceMembers, |
allTypedefs, |
mixinUses, |
typesImplementedBySubclasses, |
classHierarchyNodes, |
- classSets); |
+ classSets) { |
+ computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, |
+ enableTypeAssertions: options.enableTypeAssertions); |
+ } |
@override |
void registerClosureClass(ClassElement cls) { |
@@ -1783,6 +1849,15 @@ class JsKernelToElementMap extends KernelToElementMapBase |
typeVariableIndex++) {} |
} |
+ @override |
+ bool checkFamily(Entity entity) { |
+ assert( |
+ '$entity'.startsWith(jsElementPrefix), |
+ failedAt(entity, |
+ "Unexpected entity $entity, expected family $jsElementPrefix.")); |
+ return true; |
+ } |
+ |
JsToFrontendMap get jsToFrontendMap => _jsToFrontendMap; |
@override |