Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: pkg/compiler/lib/src/js_backend/backend.dart

Issue 1627333002: Optimize subclass/subtype queries (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Use strictSubtypeCount Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 }); 2188 });
2190 // 3) all members, including fields via getter/setters (if resolved) 2189 // 3) all members, including fields via getter/setters (if resolved)
2191 cls.forEachClassMember((Member member) { 2190 cls.forEachClassMember((Member member) {
2192 if (resolution.hasBeenProcessed(member.element)) { 2191 if (resolution.hasBeenProcessed(member.element)) {
2193 memberNames.add(member.name); 2192 memberNames.add(member.name);
2194 reflectableMembers.add(member.element); 2193 reflectableMembers.add(member.element);
2195 } 2194 }
2196 }); 2195 });
2197 // 4) all overriding members of subclasses/subtypes (should be resolved) 2196 // 4) all overriding members of subclasses/subtypes (should be resolved)
2198 if (compiler.world.hasAnyStrictSubtype(cls)) { 2197 if (compiler.world.hasAnyStrictSubtype(cls)) {
2199 for (ClassElement subcls in compiler.world.strictSubtypesOf(cls)) { 2198 compiler.world.forEachStrictSubtypeOf(cls, (ClassElement subcls) {
2200 subcls.forEachClassMember((Member member) { 2199 subcls.forEachClassMember((Member member) {
2201 if (memberNames.contains(member.name)) { 2200 if (memberNames.contains(member.name)) {
2202 // TODO(20993): find out why this assertion fails. 2201 // TODO(20993): find out why this assertion fails.
2203 // assert(invariant(member.element, 2202 // assert(invariant(member.element,
2204 // resolution.hasBeenProcessed(member.element))); 2203 // resolution.hasBeenProcessed(member.element)));
2205 if (resolution.hasBeenProcessed(member.element)) { 2204 if (resolution.hasBeenProcessed(member.element)) {
2206 reflectableMembers.add(member.element); 2205 reflectableMembers.add(member.element);
2207 } 2206 }
2208 } 2207 }
2209 }); 2208 });
2210 } 2209 });
2211 } 2210 }
2212 // 5) all its closures 2211 // 5) all its closures
2213 List<LocalFunctionElement> closures = closureMap[cls]; 2212 List<LocalFunctionElement> closures = closureMap[cls];
2214 if (closures != null) { 2213 if (closures != null) {
2215 reflectableMembers.addAll(closures); 2214 reflectableMembers.addAll(closures);
2216 foundClosure = true; 2215 foundClosure = true;
2217 } 2216 }
2218 } else { 2217 } else {
2219 // check members themselves 2218 // check members themselves
2220 cls.constructors.forEach((ConstructorElement element) { 2219 cls.constructors.forEach((ConstructorElement element) {
(...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after
3169 } 3168 }
3170 } 3169 }
3171 3170
3172 @override 3171 @override
3173 void onImpactUsed(ImpactUseCase impactUse) { 3172 void onImpactUsed(ImpactUseCase impactUse) {
3174 if (impactUse == DeferredLoadTask.IMPACT_USE) { 3173 if (impactUse == DeferredLoadTask.IMPACT_USE) {
3175 resolution.emptyCache(); 3174 resolution.emptyCache();
3176 } 3175 }
3177 } 3176 }
3178 } 3177 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698