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

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

Issue 2569733002: Even less reliance on Compiler.closedWorld (Closed)
Patch Set: Updated cf. comments. Created 4 years 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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.backend; 5 part of js_backend.backend;
6 6
7 /// For each class, stores the possible class subtype tests that could succeed. 7 /// For each class, stores the possible class subtype tests that could succeed.
8 abstract class TypeChecks { 8 abstract class TypeChecks {
9 /// Get the set of checks required for class [element]. 9 /// Get the set of checks required for class [element].
10 Iterable<TypeCheck> operator [](ClassElement element); 10 Iterable<TypeCheck> operator [](ClassElement element);
(...skipping 16 matching lines...) Expand all
27 /// to get the runtime type. 27 /// to get the runtime type.
28 Iterable<ClassElement> get classesUsingTypeVariableExpression; 28 Iterable<ClassElement> get classesUsingTypeVariableExpression;
29 29
30 void registerClassUsingTypeVariableExpression(ClassElement cls); 30 void registerClassUsingTypeVariableExpression(ClassElement cls);
31 void registerRtiDependency(Element element, Element dependency); 31 void registerRtiDependency(Element element, Element dependency);
32 void registerTypeVariableBoundsSubtypeCheck( 32 void registerTypeVariableBoundsSubtypeCheck(
33 DartType typeArgument, DartType bound); 33 DartType typeArgument, DartType bound);
34 34
35 Set<ClassElement> getClassesUsedInSubstitutions( 35 Set<ClassElement> getClassesUsedInSubstitutions(
36 JavaScriptBackend backend, TypeChecks checks); 36 JavaScriptBackend backend, TypeChecks checks);
37 void computeClassesNeedingRti(); 37 void computeClassesNeedingRti(
38 ResolutionWorldBuilder resolverWorld, ClosedWorld closedWorld);
38 39
39 /// Compute the required type checkes and substitutions for the given 40 /// Compute the required type checkes and substitutions for the given
40 /// instantitated and checked classes. 41 /// instantitated and checked classes.
41 TypeChecks computeChecks( 42 TypeChecks computeChecks(
42 Set<ClassElement> instantiated, Set<ClassElement> checked); 43 Set<ClassElement> instantiated, Set<ClassElement> checked);
43 44
44 /// Compute type arguments of classes that use one of their type variables in 45 /// Compute type arguments of classes that use one of their type variables in
45 /// is-checks and add the is-checks that they imply. 46 /// is-checks and add the is-checks that they imply.
46 /// 47 ///
47 /// This function must be called after all is-checks have been registered. 48 /// This function must be called after all is-checks have been registered.
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 universe.registerIsCheck(argument); 208 universe.registerIsCheck(argument);
208 } 209 }
209 current = current.element.supertype; 210 current = current.element.supertype;
210 } while (current != null && !instantiatedTypes.contains(current)); 211 } while (current != null && !instantiatedTypes.contains(current));
211 } 212 }
212 } 213 }
213 } 214 }
214 } 215 }
215 216
216 @override 217 @override
217 void computeClassesNeedingRti() { 218 void computeClassesNeedingRti(
219 ResolutionWorldBuilder resolverWorld, ClosedWorld closedWorld) {
218 // Find the classes that need runtime type information. Such 220 // Find the classes that need runtime type information. Such
219 // classes are: 221 // classes are:
220 // (1) used in a is check with type variables, 222 // (1) used in a is check with type variables,
221 // (2) dependencies of classes in (1), 223 // (2) dependencies of classes in (1),
222 // (3) subclasses of (2) and (3). 224 // (3) subclasses of (2) and (3).
223 void potentiallyAddForRti(ClassElement cls) { 225 void potentiallyAddForRti(ClassElement cls) {
224 assert(invariant(cls, cls.isDeclaration)); 226 assert(invariant(cls, cls.isDeclaration));
225 if (cls.typeVariables.isEmpty) return; 227 if (cls.typeVariables.isEmpty) return;
226 if (classesNeedingRti.contains(cls)) return; 228 if (classesNeedingRti.contains(cls)) return;
227 classesNeedingRti.add(cls); 229 classesNeedingRti.add(cls);
228 230
229 // TODO(ngeoffray): This should use subclasses, not subtypes. 231 // TODO(ngeoffray): This should use subclasses, not subtypes.
230 compiler.closedWorld.forEachStrictSubtypeOf(cls, (ClassElement sub) { 232 closedWorld.forEachStrictSubtypeOf(cls, (ClassElement sub) {
231 potentiallyAddForRti(sub); 233 potentiallyAddForRti(sub);
232 }); 234 });
233 235
234 Set<ClassElement> dependencies = rtiDependencies[cls]; 236 Set<ClassElement> dependencies = rtiDependencies[cls];
235 if (dependencies != null) { 237 if (dependencies != null) {
236 dependencies.forEach((ClassElement other) { 238 dependencies.forEach((ClassElement other) {
237 potentiallyAddForRti(other); 239 potentiallyAddForRti(other);
238 }); 240 });
239 } 241 }
240 } 242 }
241 243
242 Set<ClassElement> classesUsingTypeVariableTests = new Set<ClassElement>(); 244 Set<ClassElement> classesUsingTypeVariableTests = new Set<ClassElement>();
243 compiler.resolverWorld.isChecks.forEach((DartType type) { 245 resolverWorld.isChecks.forEach((DartType type) {
244 if (type.isTypeVariable) { 246 if (type.isTypeVariable) {
245 TypeVariableElement variable = type.element; 247 TypeVariableElement variable = type.element;
246 // GENERIC_METHODS: When generic method support is complete enough to 248 // GENERIC_METHODS: When generic method support is complete enough to
247 // include a runtime value for method type variables, this may need to 249 // include a runtime value for method type variables, this may need to
248 // be updated: It simply ignores method type arguments. 250 // be updated: It simply ignores method type arguments.
249 if (variable.typeDeclaration is ClassElement) { 251 if (variable.typeDeclaration is ClassElement) {
250 classesUsingTypeVariableTests.add(variable.typeDeclaration); 252 classesUsingTypeVariableTests.add(variable.typeDeclaration);
251 } 253 }
252 } 254 }
253 }); 255 });
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 * substition for this check. 1036 * substition for this check.
1035 */ 1037 */
1036 class TypeCheck { 1038 class TypeCheck {
1037 final ClassElement cls; 1039 final ClassElement cls;
1038 final Substitution substitution; 1040 final Substitution substitution;
1039 final int hashCode = _nextHash = (_nextHash + 100003).toUnsigned(30); 1041 final int hashCode = _nextHash = (_nextHash + 100003).toUnsigned(30);
1040 static int _nextHash = 0; 1042 static int _nextHash = 0;
1041 1043
1042 TypeCheck(this.cls, this.substitution); 1044 TypeCheck(this.cls, this.substitution);
1043 } 1045 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/patch_resolver.dart ('k') | pkg/compiler/lib/src/kernel/kernel_visitor.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698