Index: pkg/compiler/lib/src/world.dart |
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart |
index 7b96e20421ec3b6bfe87ac720891e41c3e7b2f4c..0dcb9fec2a9e48c213d05347682ca198168ba56d 100644 |
--- a/pkg/compiler/lib/src/world.dart |
+++ b/pkg/compiler/lib/src/world.dart |
@@ -22,12 +22,16 @@ import 'elements/types.dart'; |
import 'js_backend/backend_usage.dart' show BackendUsage; |
import 'js_backend/interceptor_data.dart' show InterceptorData; |
import 'js_backend/native_data.dart' show NativeData; |
+import 'js_backend/runtime_types.dart' |
+ show RuntimeTypesNeed, RuntimeTypesNeedBuilder; |
import 'ordered_typeset.dart'; |
+import 'options.dart'; |
import 'types/masks.dart' show CommonMasks, FlatTypeMask, TypeMask; |
import 'universe/class_set.dart'; |
import 'universe/function_set.dart' show FunctionSet; |
import 'universe/selector.dart' show Selector; |
import 'universe/side_effects.dart' show SideEffects; |
+import 'universe/world_builder.dart'; |
import 'util/util.dart' show Link; |
/// Common superinterface for [OpenWorld] and [ClosedWorld]. |
@@ -58,6 +62,10 @@ abstract class ClosedWorld implements World { |
ConstantSystem get constantSystem; |
+ RuntimeTypesNeed get rtiNeed; |
+ |
+ Iterable<ClassEntity> get liveNativeClasses; |
+ |
/// Returns `true` if [cls] is either directly or indirectly instantiated. |
bool isInstantiated(ClassEntity cls); |
@@ -451,6 +459,8 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { |
/// Members that are written either directly or through a setter selector. |
final Iterable<MemberEntity> assignedInstanceMembers; |
+ final Iterable<ClassEntity> liveNativeClasses; |
+ |
ClosedWorldBase( |
this.elementEnvironment, |
this.dartTypes, |
@@ -460,6 +470,7 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { |
this.interceptorData, |
this.backendUsage, |
Set<ClassEntity> implementedClasses, |
+ this.liveNativeClasses, |
this.liveInstanceMembers, |
this.assignedInstanceMembers, |
Set<TypedefElement> allTypedefs, |
@@ -1167,16 +1178,20 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { |
} |
} |
-class ClosedWorldImpl extends ClosedWorldBase { |
+class ClosedWorldImpl extends ClosedWorldBase with ClosedWorldRtiNeedMixin { |
ClosedWorldImpl( |
- {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, |
@@ -1193,13 +1208,17 @@ class ClosedWorldImpl extends ClosedWorldBase { |
interceptorData, |
backendUsage, |
implementedClasses, |
+ liveNativeClasses, |
liveInstanceMembers, |
assignedInstanceMembers, |
allTypedefs, |
mixinUses, |
typesImplementedBySubclasses, |
classHierarchyNodes, |
- classSets); |
+ classSets) { |
+ computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, |
+ enableTypeAssertions: options.enableTypeAssertions); |
+ } |
bool checkClass(ClassElement cls) => cls.isDeclaration; |
@@ -1315,3 +1334,17 @@ class ClosedWorldImpl extends ClosedWorldBase { |
return super.getSideEffectsOfElement(element); |
} |
} |
+ |
+abstract class ClosedWorldRtiNeedMixin implements ClosedWorld { |
+ RuntimeTypesNeed _rtiNeed; |
+ |
+ void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder, |
+ RuntimeTypesNeedBuilder rtiNeedBuilder, |
+ {bool enableTypeAssertions}) { |
+ _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed( |
+ resolutionWorldBuilder, this, |
+ enableTypeAssertions: enableTypeAssertions); |
+ } |
+ |
+ RuntimeTypesNeed get rtiNeed => _rtiNeed; |
+} |