| 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 library dart2js.world; | 5 library dart2js.world; |
| 6 | 6 |
| 7 import 'closure.dart' show ClosureClassElement; | 7 import 'closure.dart' show ClosureClassElement; |
| 8 import 'common.dart'; | 8 import 'common.dart'; |
| 9 import 'constants/constant_system.dart'; | 9 import 'constants/constant_system.dart'; |
| 10 import 'common_elements.dart' show CommonElements, ElementEnvironment; | 10 import 'common_elements.dart' show CommonElements, ElementEnvironment; |
| 11 import 'elements/entities.dart'; | 11 import 'elements/entities.dart'; |
| 12 import 'elements/elements.dart' | 12 import 'elements/elements.dart' |
| 13 show | 13 show |
| 14 ClassElement, | 14 ClassElement, |
| 15 Element, | 15 Element, |
| 16 MemberElement, | 16 MemberElement, |
| 17 MethodElement, | 17 MethodElement, |
| 18 MixinApplicationElement, | 18 MixinApplicationElement; |
| 19 TypedefElement; | |
| 20 import 'elements/resolution_types.dart'; | 19 import 'elements/resolution_types.dart'; |
| 21 import 'elements/types.dart'; | 20 import 'elements/types.dart'; |
| 22 import 'js_backend/backend_usage.dart' show BackendUsage; | 21 import 'js_backend/backend_usage.dart' show BackendUsage; |
| 23 import 'js_backend/interceptor_data.dart' show InterceptorData; | 22 import 'js_backend/interceptor_data.dart' show InterceptorData; |
| 24 import 'js_backend/native_data.dart' show NativeData; | 23 import 'js_backend/native_data.dart' show NativeData; |
| 25 import 'js_backend/runtime_types.dart' | 24 import 'js_backend/runtime_types.dart' |
| 26 show RuntimeTypesNeed, RuntimeTypesNeedBuilder; | 25 show RuntimeTypesNeed, RuntimeTypesNeedBuilder; |
| 27 import 'ordered_typeset.dart'; | 26 import 'ordered_typeset.dart'; |
| 28 import 'options.dart'; | 27 import 'options.dart'; |
| 29 import 'types/masks.dart' show CommonMasks, FlatTypeMask, TypeMask; | 28 import 'types/masks.dart' show CommonMasks, FlatTypeMask, TypeMask; |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 TypeMask getCachedMask(ClassEntity base, int flags, TypeMask createMask()); | 285 TypeMask getCachedMask(ClassEntity base, int flags, TypeMask createMask()); |
| 287 | 286 |
| 288 /// Returns `true` if the field [element] is known to be effectively final. | 287 /// Returns `true` if the field [element] is known to be effectively final. |
| 289 bool fieldNeverChanges(MemberEntity element); | 288 bool fieldNeverChanges(MemberEntity element); |
| 290 | 289 |
| 291 /// Extends the receiver type [mask] for calling [selector] to take live | 290 /// Extends the receiver type [mask] for calling [selector] to take live |
| 292 /// `noSuchMethod` handlers into account. | 291 /// `noSuchMethod` handlers into account. |
| 293 TypeMask extendMaskIfReachesAll(Selector selector, TypeMask mask); | 292 TypeMask extendMaskIfReachesAll(Selector selector, TypeMask mask); |
| 294 | 293 |
| 295 /// Returns all resolved typedefs. | 294 /// Returns all resolved typedefs. |
| 296 Iterable<TypedefElement> get allTypedefs; | 295 Iterable<TypedefEntity> get allTypedefs; |
| 297 | 296 |
| 298 /// Returns the mask for the potential receivers of a dynamic call to | 297 /// Returns the mask for the potential receivers of a dynamic call to |
| 299 /// [selector] on [mask]. | 298 /// [selector] on [mask]. |
| 300 /// | 299 /// |
| 301 /// This will narrow the constraints of [mask] to a [TypeMask] of the | 300 /// This will narrow the constraints of [mask] to a [TypeMask] of the |
| 302 /// set of classes that actually implement the selected member or implement | 301 /// set of classes that actually implement the selected member or implement |
| 303 /// the handling 'noSuchMethod' where the selected member is unimplemented. | 302 /// the handling 'noSuchMethod' where the selected member is unimplemented. |
| 304 TypeMask computeReceiverType(Selector selector, TypeMask mask); | 303 TypeMask computeReceiverType(Selector selector, TypeMask mask); |
| 305 | 304 |
| 306 /// Returns all the instance members that may be invoked with the | 305 /// Returns all the instance members that may be invoked with the |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 } | 380 } |
| 382 | 381 |
| 383 abstract class OpenWorld implements World { | 382 abstract class OpenWorld implements World { |
| 384 /// Called to add [cls] to the set of known classes. | 383 /// Called to add [cls] to the set of known classes. |
| 385 /// | 384 /// |
| 386 /// This ensures that class hierarchy queries can be performed on [cls] and | 385 /// This ensures that class hierarchy queries can be performed on [cls] and |
| 387 /// classes that extend or implement it. | 386 /// classes that extend or implement it. |
| 388 void registerClass(covariant ClassEntity cls); | 387 void registerClass(covariant ClassEntity cls); |
| 389 | 388 |
| 390 void registerUsedElement(MemberEntity element); | 389 void registerUsedElement(MemberEntity element); |
| 391 void registerTypedef(TypedefElement typedef); | 390 void registerTypedef(TypedefEntity typedef); |
| 392 | 391 |
| 393 ClosedWorld closeWorld(); | 392 ClosedWorld closeWorld(); |
| 394 | 393 |
| 395 /// Returns an iterable over all mixin applications that mixin [cls]. | 394 /// Returns an iterable over all mixin applications that mixin [cls]. |
| 396 Iterable<ClassEntity> allMixinUsesOf(ClassEntity cls); | 395 Iterable<ClassEntity> allMixinUsesOf(ClassEntity cls); |
| 397 } | 396 } |
| 398 | 397 |
| 399 /// Enum values defining subset of classes included in queries. | 398 /// Enum values defining subset of classes included in queries. |
| 400 enum ClassQuery { | 399 enum ClassQuery { |
| 401 /// Only the class itself is included. | 400 /// Only the class itself is included. |
| 402 EXACT, | 401 EXACT, |
| 403 | 402 |
| 404 /// The class and all subclasses (transitively) are included. | 403 /// The class and all subclasses (transitively) are included. |
| 405 SUBCLASS, | 404 SUBCLASS, |
| 406 | 405 |
| 407 /// The class and all classes that implement or subclass it (transitively) | 406 /// The class and all classes that implement or subclass it (transitively) |
| 408 /// are included. | 407 /// are included. |
| 409 SUBTYPE, | 408 SUBTYPE, |
| 410 } | 409 } |
| 411 | 410 |
| 412 abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { | 411 abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { |
| 413 final ConstantSystem constantSystem; | 412 final ConstantSystem constantSystem; |
| 414 final NativeData nativeData; | 413 final NativeData nativeData; |
| 415 final InterceptorData interceptorData; | 414 final InterceptorData interceptorData; |
| 416 final BackendUsage backendUsage; | 415 final BackendUsage backendUsage; |
| 417 | 416 |
| 418 FunctionSet _allFunctions; | 417 FunctionSet _allFunctions; |
| 419 | 418 |
| 420 final Set<TypedefElement> _allTypedefs; | 419 final Set<TypedefEntity> _allTypedefs; |
| 421 | 420 |
| 422 final Map<ClassEntity, Set<ClassEntity>> mixinUses; | 421 final Map<ClassEntity, Set<ClassEntity>> mixinUses; |
| 423 Map<ClassEntity, List<ClassEntity>> _liveMixinUses; | 422 Map<ClassEntity, List<ClassEntity>> _liveMixinUses; |
| 424 | 423 |
| 425 final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses; | 424 final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses; |
| 426 | 425 |
| 427 // We keep track of subtype and subclass relationships in four | 426 // We keep track of subtype and subclass relationships in four |
| 428 // distinct sets to make class hierarchy analysis faster. | 427 // distinct sets to make class hierarchy analysis faster. |
| 429 final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes; | 428 final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes; |
| 430 final Map<ClassEntity, ClassSet> _classSets; | 429 final Map<ClassEntity, ClassSet> _classSets; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 this.dartTypes, | 465 this.dartTypes, |
| 467 this.commonElements, | 466 this.commonElements, |
| 468 this.constantSystem, | 467 this.constantSystem, |
| 469 this.nativeData, | 468 this.nativeData, |
| 470 this.interceptorData, | 469 this.interceptorData, |
| 471 this.backendUsage, | 470 this.backendUsage, |
| 472 Set<ClassEntity> implementedClasses, | 471 Set<ClassEntity> implementedClasses, |
| 473 this.liveNativeClasses, | 472 this.liveNativeClasses, |
| 474 this.liveInstanceMembers, | 473 this.liveInstanceMembers, |
| 475 this.assignedInstanceMembers, | 474 this.assignedInstanceMembers, |
| 476 Set<TypedefElement> allTypedefs, | 475 Set<TypedefEntity> allTypedefs, |
| 477 this.mixinUses, | 476 this.mixinUses, |
| 478 this.typesImplementedBySubclasses, | 477 this.typesImplementedBySubclasses, |
| 479 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | 478 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, |
| 480 Map<ClassEntity, ClassSet> classSets) | 479 Map<ClassEntity, ClassSet> classSets) |
| 481 : this._implementedClasses = implementedClasses, | 480 : this._implementedClasses = implementedClasses, |
| 482 this._allTypedefs = allTypedefs, | 481 this._allTypedefs = allTypedefs, |
| 483 this._classHierarchyNodes = classHierarchyNodes, | 482 this._classHierarchyNodes = classHierarchyNodes, |
| 484 this._classSets = classSets { | 483 this._classSets = classSets { |
| 485 _commonMasks = new CommonMasks(this); | 484 _commonMasks = new CommonMasks(this); |
| 486 } | 485 } |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1009 /// Returns [ClassSet] for [cls] used to model the extends and implements | 1008 /// Returns [ClassSet] for [cls] used to model the extends and implements |
| 1010 /// relations of known classes. | 1009 /// relations of known classes. |
| 1011 /// | 1010 /// |
| 1012 /// This method is only provided for testing. For queries on classes, use the | 1011 /// This method is only provided for testing. For queries on classes, use the |
| 1013 /// methods defined in [ClosedWorld]. | 1012 /// methods defined in [ClosedWorld]. |
| 1014 ClassSet getClassSet(ClassEntity cls) { | 1013 ClassSet getClassSet(ClassEntity cls) { |
| 1015 assert(checkClass(cls)); | 1014 assert(checkClass(cls)); |
| 1016 return _classSets[cls]; | 1015 return _classSets[cls]; |
| 1017 } | 1016 } |
| 1018 | 1017 |
| 1019 Iterable<TypedefElement> get allTypedefs => _allTypedefs; | 1018 Iterable<TypedefEntity> get allTypedefs => _allTypedefs; |
| 1020 | 1019 |
| 1021 void _ensureFunctionSet() { | 1020 void _ensureFunctionSet() { |
| 1022 if (_allFunctions == null) { | 1021 if (_allFunctions == null) { |
| 1023 // [FunctionSet] is created lazily because it is not used when we switch | 1022 // [FunctionSet] is created lazily because it is not used when we switch |
| 1024 // from a frontend to a backend model before inference. | 1023 // from a frontend to a backend model before inference. |
| 1025 _allFunctions = new FunctionSet(liveInstanceMembers); | 1024 _allFunctions = new FunctionSet(liveInstanceMembers); |
| 1026 } | 1025 } |
| 1027 } | 1026 } |
| 1028 | 1027 |
| 1029 TypeMask computeReceiverType(Selector selector, TypeMask mask) { | 1028 TypeMask computeReceiverType(Selector selector, TypeMask mask) { |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1189 ConstantSystem constantSystem, | 1188 ConstantSystem constantSystem, |
| 1190 NativeData nativeData, | 1189 NativeData nativeData, |
| 1191 InterceptorData interceptorData, | 1190 InterceptorData interceptorData, |
| 1192 BackendUsage backendUsage, | 1191 BackendUsage backendUsage, |
| 1193 ResolutionWorldBuilder resolutionWorldBuilder, | 1192 ResolutionWorldBuilder resolutionWorldBuilder, |
| 1194 RuntimeTypesNeedBuilder rtiNeedBuilder, | 1193 RuntimeTypesNeedBuilder rtiNeedBuilder, |
| 1195 Set<ClassEntity> implementedClasses, | 1194 Set<ClassEntity> implementedClasses, |
| 1196 Iterable<ClassEntity> liveNativeClasses, | 1195 Iterable<ClassEntity> liveNativeClasses, |
| 1197 Iterable<MemberEntity> liveInstanceMembers, | 1196 Iterable<MemberEntity> liveInstanceMembers, |
| 1198 Iterable<MemberEntity> assignedInstanceMembers, | 1197 Iterable<MemberEntity> assignedInstanceMembers, |
| 1199 Set<TypedefElement> allTypedefs, | 1198 Set<TypedefEntity> allTypedefs, |
| 1200 Map<ClassEntity, Set<ClassEntity>> mixinUses, | 1199 Map<ClassEntity, Set<ClassEntity>> mixinUses, |
| 1201 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, | 1200 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, |
| 1202 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | 1201 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, |
| 1203 Map<ClassEntity, ClassSet> classSets}) | 1202 Map<ClassEntity, ClassSet> classSets}) |
| 1204 : super( | 1203 : super( |
| 1205 elementEnvironment, | 1204 elementEnvironment, |
| 1206 dartTypes, | 1205 dartTypes, |
| 1207 commonElements, | 1206 commonElements, |
| 1208 constantSystem, | 1207 constantSystem, |
| 1209 nativeData, | 1208 nativeData, |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1343 void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder, | 1342 void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder, |
| 1344 RuntimeTypesNeedBuilder rtiNeedBuilder, | 1343 RuntimeTypesNeedBuilder rtiNeedBuilder, |
| 1345 {bool enableTypeAssertions}) { | 1344 {bool enableTypeAssertions}) { |
| 1346 _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed( | 1345 _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed( |
| 1347 resolutionWorldBuilder, this, | 1346 resolutionWorldBuilder, this, |
| 1348 enableTypeAssertions: enableTypeAssertions); | 1347 enableTypeAssertions: enableTypeAssertions); |
| 1349 } | 1348 } |
| 1350 | 1349 |
| 1351 RuntimeTypesNeed get rtiNeed => _rtiNeed; | 1350 RuntimeTypesNeed get rtiNeed => _rtiNeed; |
| 1352 } | 1351 } |
| OLD | NEW |