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

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: Cleanup Created 4 years, 11 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 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698