| 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 classWorld.forEachStrictSubclassOf(use, (ClassElement subclass) { | 977 Iterable<ClassElement> subclasses = classWorld.strictSubclassesOf(use); |
| 978 for (ClassElement subclass in subclasses) { |
| 978 if (isNativeOrExtendsNative(subclass)) { | 979 if (isNativeOrExtendsNative(subclass)) { |
| 979 if (result == null) result = new Set<ClassElement>(); | 980 if (result == null) result = new Set<ClassElement>(); |
| 980 result.add(subclass); | 981 result.add(subclass); |
| 981 } | 982 } |
| 982 }); | 983 } |
| 983 } | 984 } |
| 984 return result; | 985 return result; |
| 985 } | 986 } |
| 986 | 987 |
| 987 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { | 988 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { |
| 988 return specialOperatorEqClasses.contains( | 989 return specialOperatorEqClasses.contains( |
| 989 operatorEqfunction.enclosingClass); | 990 operatorEqfunction.enclosingClass); |
| 990 } | 991 } |
| 991 | 992 |
| 992 void validateInterceptorImplementsAllObjectMethods( | 993 void validateInterceptorImplementsAllObjectMethods( |
| (...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2188 }); | 2189 }); |
| 2189 // 3) all members, including fields via getter/setters (if resolved) | 2190 // 3) all members, including fields via getter/setters (if resolved) |
| 2190 cls.forEachClassMember((Member member) { | 2191 cls.forEachClassMember((Member member) { |
| 2191 if (resolution.hasBeenProcessed(member.element)) { | 2192 if (resolution.hasBeenProcessed(member.element)) { |
| 2192 memberNames.add(member.name); | 2193 memberNames.add(member.name); |
| 2193 reflectableMembers.add(member.element); | 2194 reflectableMembers.add(member.element); |
| 2194 } | 2195 } |
| 2195 }); | 2196 }); |
| 2196 // 4) all overriding members of subclasses/subtypes (should be resolved) | 2197 // 4) all overriding members of subclasses/subtypes (should be resolved) |
| 2197 if (compiler.world.hasAnyStrictSubtype(cls)) { | 2198 if (compiler.world.hasAnyStrictSubtype(cls)) { |
| 2198 compiler.world.forEachStrictSubtypeOf(cls, (ClassElement subcls) { | 2199 for (ClassElement subcls in compiler.world.strictSubtypesOf(cls)) { |
| 2199 subcls.forEachClassMember((Member member) { | 2200 subcls.forEachClassMember((Member member) { |
| 2200 if (memberNames.contains(member.name)) { | 2201 if (memberNames.contains(member.name)) { |
| 2201 // TODO(20993): find out why this assertion fails. | 2202 // TODO(20993): find out why this assertion fails. |
| 2202 // assert(invariant(member.element, | 2203 // assert(invariant(member.element, |
| 2203 // resolution.hasBeenProcessed(member.element))); | 2204 // resolution.hasBeenProcessed(member.element))); |
| 2204 if (resolution.hasBeenProcessed(member.element)) { | 2205 if (resolution.hasBeenProcessed(member.element)) { |
| 2205 reflectableMembers.add(member.element); | 2206 reflectableMembers.add(member.element); |
| 2206 } | 2207 } |
| 2207 } | 2208 } |
| 2208 }); | 2209 }); |
| 2209 }); | 2210 } |
| 2210 } | 2211 } |
| 2211 // 5) all its closures | 2212 // 5) all its closures |
| 2212 List<LocalFunctionElement> closures = closureMap[cls]; | 2213 List<LocalFunctionElement> closures = closureMap[cls]; |
| 2213 if (closures != null) { | 2214 if (closures != null) { |
| 2214 reflectableMembers.addAll(closures); | 2215 reflectableMembers.addAll(closures); |
| 2215 foundClosure = true; | 2216 foundClosure = true; |
| 2216 } | 2217 } |
| 2217 } else { | 2218 } else { |
| 2218 // check members themselves | 2219 // check members themselves |
| 2219 cls.constructors.forEach((ConstructorElement element) { | 2220 cls.constructors.forEach((ConstructorElement element) { |
| (...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3168 } | 3169 } |
| 3169 } | 3170 } |
| 3170 | 3171 |
| 3171 @override | 3172 @override |
| 3172 void onImpactUsed(ImpactUseCase impactUse) { | 3173 void onImpactUsed(ImpactUseCase impactUse) { |
| 3173 if (impactUse == DeferredLoadTask.IMPACT_USE) { | 3174 if (impactUse == DeferredLoadTask.IMPACT_USE) { |
| 3174 resolution.emptyCache(); | 3175 resolution.emptyCache(); |
| 3175 } | 3176 } |
| 3176 } | 3177 } |
| 3177 } | 3178 } |
| OLD | NEW |