| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of js_backend; | 5 part of js_backend; |
| 6 | 6 |
| 7 const VERBOSE_OPTIMIZER_HINTS = false; | 7 const VERBOSE_OPTIMIZER_HINTS = false; |
| 8 | 8 |
| 9 class JavaScriptItemCompilationContext extends ItemCompilationContext { | 9 class JavaScriptItemCompilationContext extends ItemCompilationContext { |
| 10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); | 10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); |
| (...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 } | 967 } |
| 968 return result; | 968 return result; |
| 969 }); | 969 }); |
| 970 } | 970 } |
| 971 | 971 |
| 972 Set<ClassElement> nativeSubclassesOfMixin(ClassElement mixin) { | 972 Set<ClassElement> nativeSubclassesOfMixin(ClassElement mixin) { |
| 973 ClassWorld classWorld = compiler.world; | 973 ClassWorld classWorld = compiler.world; |
| 974 Iterable<MixinApplicationElement> uses = classWorld.mixinUsesOf(mixin); | 974 Iterable<MixinApplicationElement> uses = classWorld.mixinUsesOf(mixin); |
| 975 Set<ClassElement> result = null; | 975 Set<ClassElement> result = null; |
| 976 for (MixinApplicationElement use in uses) { | 976 for (MixinApplicationElement use in uses) { |
| 977 Iterable<ClassElement> subclasses = classWorld.strictSubclassesOf(use); | 977 classWorld.forEachStrictSubclassOf(use, (ClassElement subclass) { |
| 978 for (ClassElement subclass in subclasses) { | |
| 979 if (isNativeOrExtendsNative(subclass)) { | 978 if (isNativeOrExtendsNative(subclass)) { |
| 980 if (result == null) result = new Set<ClassElement>(); | 979 if (result == null) result = new Set<ClassElement>(); |
| 981 result.add(subclass); | 980 result.add(subclass); |
| 982 } | 981 } |
| 983 } | 982 }); |
| 984 } | 983 } |
| 985 return result; | 984 return result; |
| 986 } | 985 } |
| 987 | 986 |
| 988 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { | 987 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { |
| 989 return specialOperatorEqClasses.contains( | 988 return specialOperatorEqClasses.contains( |
| 990 operatorEqfunction.enclosingClass); | 989 operatorEqfunction.enclosingClass); |
| 991 } | 990 } |
| 992 | 991 |
| 993 void validateInterceptorImplementsAllObjectMethods( | 992 void validateInterceptorImplementsAllObjectMethods( |
| (...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2184 }); | 2183 }); |
| 2185 // 3) all members, including fields via getter/setters (if resolved) | 2184 // 3) all members, including fields via getter/setters (if resolved) |
| 2186 cls.forEachClassMember((Member member) { | 2185 cls.forEachClassMember((Member member) { |
| 2187 if (resolution.hasBeenProcessed(member.element)) { | 2186 if (resolution.hasBeenProcessed(member.element)) { |
| 2188 memberNames.add(member.name); | 2187 memberNames.add(member.name); |
| 2189 reflectableMembers.add(member.element); | 2188 reflectableMembers.add(member.element); |
| 2190 } | 2189 } |
| 2191 }); | 2190 }); |
| 2192 // 4) all overriding members of subclasses/subtypes (should be resolved) | 2191 // 4) all overriding members of subclasses/subtypes (should be resolved) |
| 2193 if (compiler.world.hasAnyStrictSubtype(cls)) { | 2192 if (compiler.world.hasAnyStrictSubtype(cls)) { |
| 2194 for (ClassElement subcls in compiler.world.strictSubtypesOf(cls)) { | 2193 compiler.world.forEachStrictSubtypeOf(cls, (ClassElement subcls) { |
| 2195 subcls.forEachClassMember((Member member) { | 2194 subcls.forEachClassMember((Member member) { |
| 2196 if (memberNames.contains(member.name)) { | 2195 if (memberNames.contains(member.name)) { |
| 2197 // TODO(20993): find out why this assertion fails. | 2196 // TODO(20993): find out why this assertion fails. |
| 2198 // assert(invariant(member.element, | 2197 // assert(invariant(member.element, |
| 2199 // resolution.hasBeenProcessed(member.element))); | 2198 // resolution.hasBeenProcessed(member.element))); |
| 2200 if (resolution.hasBeenProcessed(member.element)) { | 2199 if (resolution.hasBeenProcessed(member.element)) { |
| 2201 reflectableMembers.add(member.element); | 2200 reflectableMembers.add(member.element); |
| 2202 } | 2201 } |
| 2203 } | 2202 } |
| 2204 }); | 2203 }); |
| 2205 } | 2204 }); |
| 2206 } | 2205 } |
| 2207 // 5) all its closures | 2206 // 5) all its closures |
| 2208 List<LocalFunctionElement> closures = closureMap[cls]; | 2207 List<LocalFunctionElement> closures = closureMap[cls]; |
| 2209 if (closures != null) { | 2208 if (closures != null) { |
| 2210 reflectableMembers.addAll(closures); | 2209 reflectableMembers.addAll(closures); |
| 2211 foundClosure = true; | 2210 foundClosure = true; |
| 2212 } | 2211 } |
| 2213 } else { | 2212 } else { |
| 2214 // check members themselves | 2213 // check members themselves |
| 2215 cls.constructors.forEach((ConstructorElement element) { | 2214 cls.constructors.forEach((ConstructorElement element) { |
| (...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3164 } | 3163 } |
| 3165 } | 3164 } |
| 3166 | 3165 |
| 3167 @override | 3166 @override |
| 3168 void onImpactUsed(ImpactUseCase impactUse) { | 3167 void onImpactUsed(ImpactUseCase impactUse) { |
| 3169 if (impactUse == DeferredLoadTask.IMPACT_USE) { | 3168 if (impactUse == DeferredLoadTask.IMPACT_USE) { |
| 3170 resolution.emptyCache(); | 3169 resolution.emptyCache(); |
| 3171 } | 3170 } |
| 3172 } | 3171 } |
| 3173 } | 3172 } |
| OLD | NEW |