| Index: pkg/compiler/lib/src/js_backend/interceptor_data.dart
|
| diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
|
| index 23b990d552562b0616788ef18a9d3268e94207fa..8a0d5a7fc54a383f595e9d60311c1f151b91e3ee 100644
|
| --- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
|
| @@ -25,32 +25,31 @@ abstract class InterceptorData {
|
| bool fieldHasInterceptedSetter(FieldEntity element);
|
| bool isInterceptedName(String name);
|
| bool isInterceptedSelector(Selector selector);
|
| - bool isInterceptedMixinSelector(
|
| - Selector selector, TypeMask mask, ClosedWorld closedWorld);
|
| + bool isInterceptedMixinSelector(Selector selector, TypeMask mask);
|
| Iterable<ClassEntity> get interceptedClasses;
|
| bool isMixedIntoInterceptedClass(ClassEntity element);
|
|
|
| /// Returns a set of interceptor classes that contain a member named [name]
|
| ///
|
| /// Returns an empty set if there is no class. Do not modify the returned set.
|
| - Set<ClassEntity> getInterceptedClassesOn(
|
| - String name, ClosedWorld closedWorld);
|
| + Set<ClassEntity> getInterceptedClassesOn(String name);
|
|
|
| /// Whether the compiler can use the native `instanceof` check to test for
|
| /// instances of [type]. This is true for types that are not used as mixins or
|
| /// interfaces.
|
| - bool mayGenerateInstanceofCheck(DartType type, ClosedWorld closedWorld);
|
| + bool mayGenerateInstanceofCheck(DartType type);
|
| }
|
|
|
| abstract class InterceptorDataBuilder {
|
| void addInterceptors(ClassEntity cls);
|
| void addInterceptorsForNativeClassMembers(ClassEntity cls);
|
| - InterceptorData onResolutionComplete();
|
| + InterceptorData onResolutionComplete(ClosedWorld closedWorld);
|
| }
|
|
|
| class InterceptorDataImpl implements InterceptorData {
|
| final NativeBasicData _nativeData;
|
| final CommonElements _commonElements;
|
| + final ClosedWorld _closedWorld;
|
|
|
| /// The members of instantiated interceptor classes: maps a member name to the
|
| /// list of members that have that name. This map is used by the codegen to
|
| @@ -85,6 +84,7 @@ class InterceptorDataImpl implements InterceptorData {
|
| InterceptorDataImpl(
|
| this._nativeData,
|
| this._commonElements,
|
| + this._closedWorld,
|
| this._interceptedElements,
|
| this._interceptedClasses,
|
| this._classesMixedIntoInterceptedClasses);
|
| @@ -116,8 +116,7 @@ class InterceptorDataImpl implements InterceptorData {
|
| /// Returns `true` iff [selector] matches an element defined in a class mixed
|
| /// into an intercepted class. These selectors are not eligible for the
|
| /// 'dummy explicit receiver' optimization.
|
| - bool isInterceptedMixinSelector(
|
| - Selector selector, TypeMask mask, ClosedWorld closedWorld) {
|
| + bool isInterceptedMixinSelector(Selector selector, TypeMask mask) {
|
| Set<MemberEntity> elements =
|
| _interceptedMixinElements.putIfAbsent(selector.name, () {
|
| Set<MemberEntity> elements = _interceptedElements[selector.name];
|
| @@ -132,7 +131,7 @@ class InterceptorDataImpl implements InterceptorData {
|
| if (elements.isEmpty) return false;
|
| return elements.any((element) {
|
| return selector.applies(element) &&
|
| - (mask == null || mask.canHit(element, selector, closedWorld));
|
| + (mask == null || mask.canHit(element, selector, _closedWorld));
|
| });
|
| }
|
|
|
| @@ -151,8 +150,7 @@ class InterceptorDataImpl implements InterceptorData {
|
| /// Returns a set of interceptor classes that contain a member named [name]
|
| ///
|
| /// Returns an empty set if there is no class. Do not modify the returned set.
|
| - Set<ClassEntity> getInterceptedClassesOn(
|
| - String name, ClosedWorld closedWorld) {
|
| + Set<ClassEntity> getInterceptedClassesOn(String name) {
|
| Set<MemberEntity> intercepted = _interceptedElements[name];
|
| if (intercepted == null) return _noClasses;
|
| return _interceptedClassesCache.putIfAbsent(name, () {
|
| @@ -168,7 +166,7 @@ class InterceptorDataImpl implements InterceptorData {
|
| }
|
| if (_classesMixedIntoInterceptedClasses.contains(classElement)) {
|
| Set<ClassEntity> nativeSubclasses =
|
| - nativeSubclassesOfMixin(classElement, closedWorld);
|
| + nativeSubclassesOfMixin(classElement);
|
| if (nativeSubclasses != null) result.addAll(nativeSubclasses);
|
| }
|
| }
|
| @@ -176,12 +174,11 @@ class InterceptorDataImpl implements InterceptorData {
|
| });
|
| }
|
|
|
| - Set<ClassEntity> nativeSubclassesOfMixin(
|
| - ClassEntity mixin, ClosedWorld closedWorld) {
|
| - Iterable<ClassEntity> uses = closedWorld.mixinUsesOf(mixin);
|
| + Set<ClassEntity> nativeSubclassesOfMixin(ClassEntity mixin) {
|
| + Iterable<ClassEntity> uses = _closedWorld.mixinUsesOf(mixin);
|
| Set<ClassEntity> result = null;
|
| for (ClassEntity use in uses) {
|
| - closedWorld.forEachStrictSubclassOf(use, (ClassEntity subclass) {
|
| + _closedWorld.forEachStrictSubclassOf(use, (ClassEntity subclass) {
|
| if (_nativeData.isNativeOrExtendsNative(subclass)) {
|
| if (result == null) result = new Set<ClassEntity>();
|
| result.add(subclass);
|
| @@ -204,7 +201,7 @@ class InterceptorDataImpl implements InterceptorData {
|
|
|
| Iterable<ClassEntity> get interceptedClasses => _interceptedClasses;
|
|
|
| - bool mayGenerateInstanceofCheck(DartType type, ClosedWorld closedWorld) {
|
| + bool mayGenerateInstanceofCheck(DartType type) {
|
| // We can use an instanceof check for raw types that have no subclass that
|
| // is mixed-in or in an implements clause.
|
|
|
| @@ -212,7 +209,7 @@ class InterceptorDataImpl implements InterceptorData {
|
| InterfaceType interfaceType = type;
|
| ClassEntity classElement = interfaceType.element;
|
| if (isInterceptedClass(classElement)) return false;
|
| - return closedWorld.hasOnlySubclasses(classElement);
|
| + return _closedWorld.hasOnlySubclasses(classElement);
|
| }
|
| }
|
|
|
| @@ -239,10 +236,11 @@ class InterceptorDataBuilderImpl implements InterceptorDataBuilder {
|
| InterceptorDataBuilderImpl(
|
| this._nativeData, this._elementEnvironment, this._commonElements);
|
|
|
| - InterceptorData onResolutionComplete() {
|
| + InterceptorData onResolutionComplete(ClosedWorld closedWorld) {
|
| return new InterceptorDataImpl(
|
| _nativeData,
|
| _commonElements,
|
| + closedWorld,
|
| _interceptedElements,
|
| _interceptedClasses,
|
| _classesMixedIntoInterceptedClasses);
|
| @@ -311,10 +309,9 @@ class OneShotInterceptorData {
|
| Set<ClassEntity> getSpecializedGetInterceptorsFor(jsAst.Name name) =>
|
| _specializedGetInterceptors[name];
|
|
|
| - jsAst.Name registerOneShotInterceptor(
|
| - Selector selector, Namer namer, ClosedWorld closedWorld) {
|
| + jsAst.Name registerOneShotInterceptor(Selector selector, Namer namer) {
|
| Set<ClassEntity> classes =
|
| - _interceptorData.getInterceptedClassesOn(selector.name, closedWorld);
|
| + _interceptorData.getInterceptedClassesOn(selector.name);
|
| jsAst.Name name = namer.nameForGetOneShotInterceptor(selector, classes);
|
| if (!_oneShotInterceptors.containsKey(name)) {
|
| registerSpecializedGetInterceptor(classes, namer);
|
|
|