| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 world_builder; | 5 part of world_builder; |
| 6 | 6 |
| 7 abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld { | 7 abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld { |
| 8 /// Set of all local functions in the program. Used by the mirror tracking | 8 /// Set of all local functions in the program. Used by the mirror tracking |
| 9 /// system to find all live closure instances. | 9 /// system to find all live closure instances. |
| 10 Iterable<Local> get localFunctions; | 10 Iterable<Local> get localFunctions; |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 /// Set of methods in instantiated classes that are potentially closurized. | 329 /// Set of methods in instantiated classes that are potentially closurized. |
| 330 final Set<FunctionEntity> closurizedMembers = new Set<FunctionEntity>(); | 330 final Set<FunctionEntity> closurizedMembers = new Set<FunctionEntity>(); |
| 331 | 331 |
| 332 /// Set of live closurized members whose signatures reference type variables. | 332 /// Set of live closurized members whose signatures reference type variables. |
| 333 /// | 333 /// |
| 334 /// A closurized method is considered live if the enclosing class has been | 334 /// A closurized method is considered live if the enclosing class has been |
| 335 /// instantiated. | 335 /// instantiated. |
| 336 final Set<FunctionEntity> closurizedMembersWithFreeTypeVariables = | 336 final Set<FunctionEntity> closurizedMembersWithFreeTypeVariables = |
| 337 new Set<FunctionEntity>(); | 337 new Set<FunctionEntity>(); |
| 338 | 338 |
| 339 final CompilerOptions _options; |
| 339 final ElementEnvironment _elementEnvironment; | 340 final ElementEnvironment _elementEnvironment; |
| 340 final DartTypes _dartTypes; | 341 final DartTypes _dartTypes; |
| 341 final CommonElements _commonElements; | 342 final CommonElements _commonElements; |
| 342 final ConstantSystem _constantSystem; | 343 final ConstantSystem _constantSystem; |
| 343 | 344 |
| 344 final NativeBasicData _nativeBasicData; | 345 final NativeBasicData _nativeBasicData; |
| 345 final NativeDataBuilder _nativeDataBuilder; | 346 final NativeDataBuilder _nativeDataBuilder; |
| 346 final InterceptorDataBuilder _interceptorDataBuilder; | 347 final InterceptorDataBuilder _interceptorDataBuilder; |
| 347 final BackendUsageBuilder _backendUsageBuilder; | 348 final BackendUsageBuilder _backendUsageBuilder; |
| 349 final RuntimeTypesNeedBuilder _rtiNeedBuilder; |
| 350 final NativeResolutionEnqueuer _nativeResolutionEnqueuer; |
| 348 | 351 |
| 349 final SelectorConstraintsStrategy selectorConstraintsStrategy; | 352 final SelectorConstraintsStrategy selectorConstraintsStrategy; |
| 350 | 353 |
| 351 bool hasRuntimeTypeSupport = false; | 354 bool hasRuntimeTypeSupport = false; |
| 352 bool hasIsolateSupport = false; | 355 bool hasIsolateSupport = false; |
| 353 bool hasFunctionApplySupport = false; | 356 bool hasFunctionApplySupport = false; |
| 354 | 357 |
| 355 bool _closed = false; | 358 bool _closed = false; |
| 356 ClosedWorld _closedWorldCache; | 359 ClosedWorld _closedWorldCache; |
| 357 final Set<MemberEntity> _liveInstanceMembers = new Set<MemberEntity>(); | 360 final Set<MemberEntity> _liveInstanceMembers = new Set<MemberEntity>(); |
| 358 | 361 |
| 359 final Set<TypedefElement> _allTypedefs = new Set<TypedefElement>(); | 362 final Set<TypedefElement> _allTypedefs = new Set<TypedefElement>(); |
| 360 | 363 |
| 361 final Map<ClassEntity, Set<ClassEntity>> _mixinUses = | 364 final Map<ClassEntity, Set<ClassEntity>> _mixinUses = |
| 362 new Map<ClassEntity, Set<ClassEntity>>(); | 365 new Map<ClassEntity, Set<ClassEntity>>(); |
| 363 | 366 |
| 364 // We keep track of subtype and subclass relationships in four | 367 // We keep track of subtype and subclass relationships in four |
| 365 // distinct sets to make class hierarchy analysis faster. | 368 // distinct sets to make class hierarchy analysis faster. |
| 366 final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes = | 369 final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes = |
| 367 <ClassEntity, ClassHierarchyNode>{}; | 370 <ClassEntity, ClassHierarchyNode>{}; |
| 368 final Map<ClassEntity, ClassSet> _classSets = <ClassEntity, ClassSet>{}; | 371 final Map<ClassEntity, ClassSet> _classSets = <ClassEntity, ClassSet>{}; |
| 369 | 372 |
| 370 final Set<ConstantValue> _constantValues = new Set<ConstantValue>(); | 373 final Set<ConstantValue> _constantValues = new Set<ConstantValue>(); |
| 371 | 374 |
| 372 bool get isClosed => _closed; | 375 bool get isClosed => _closed; |
| 373 | 376 |
| 374 ResolutionWorldBuilderBase( | 377 ResolutionWorldBuilderBase( |
| 378 this._options, |
| 375 this._elementEnvironment, | 379 this._elementEnvironment, |
| 376 this._dartTypes, | 380 this._dartTypes, |
| 377 this._commonElements, | 381 this._commonElements, |
| 378 this._constantSystem, | 382 this._constantSystem, |
| 379 this._nativeBasicData, | 383 this._nativeBasicData, |
| 380 this._nativeDataBuilder, | 384 this._nativeDataBuilder, |
| 381 this._interceptorDataBuilder, | 385 this._interceptorDataBuilder, |
| 382 this._backendUsageBuilder, | 386 this._backendUsageBuilder, |
| 387 this._rtiNeedBuilder, |
| 388 this._nativeResolutionEnqueuer, |
| 383 this.selectorConstraintsStrategy); | 389 this.selectorConstraintsStrategy); |
| 384 | 390 |
| 385 Iterable<ClassEntity> get processedClasses => _processedClasses.keys | 391 Iterable<ClassEntity> get processedClasses => _processedClasses.keys |
| 386 .where((cls) => _processedClasses[cls].isInstantiated); | 392 .where((cls) => _processedClasses[cls].isInstantiated); |
| 387 | 393 |
| 388 ClosedWorld get closedWorldForTesting { | 394 ClosedWorld get closedWorldForTesting { |
| 389 if (!_closed) { | 395 if (!_closed) { |
| 390 throw new SpannableAssertionFailure( | 396 throw new SpannableAssertionFailure( |
| 391 NO_LOCATION_SPANNABLE, "The world builder has not yet been closed."); | 397 NO_LOCATION_SPANNABLE, "The world builder has not yet been closed."); |
| 392 } | 398 } |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 assignedInstanceMembers.addAll(fieldSetters); | 945 assignedInstanceMembers.addAll(fieldSetters); |
| 940 return assignedInstanceMembers; | 946 return assignedInstanceMembers; |
| 941 } | 947 } |
| 942 } | 948 } |
| 943 | 949 |
| 944 abstract class KernelResolutionWorldBuilderBase | 950 abstract class KernelResolutionWorldBuilderBase |
| 945 extends ResolutionWorldBuilderBase { | 951 extends ResolutionWorldBuilderBase { |
| 946 KernelToElementMapForImpactImpl get elementMap; | 952 KernelToElementMapForImpactImpl get elementMap; |
| 947 | 953 |
| 948 KernelResolutionWorldBuilderBase( | 954 KernelResolutionWorldBuilderBase( |
| 955 CompilerOptions options, |
| 949 ElementEnvironment elementEnvironment, | 956 ElementEnvironment elementEnvironment, |
| 950 DartTypes dartTypes, | 957 DartTypes dartTypes, |
| 951 CommonElements commonElements, | 958 CommonElements commonElements, |
| 952 ConstantSystem constantSystem, | 959 ConstantSystem constantSystem, |
| 953 NativeBasicData nativeBasicData, | 960 NativeBasicData nativeBasicData, |
| 954 NativeDataBuilder nativeDataBuilder, | 961 NativeDataBuilder nativeDataBuilder, |
| 955 InterceptorDataBuilder interceptorDataBuilder, | 962 InterceptorDataBuilder interceptorDataBuilder, |
| 956 BackendUsageBuilder backendUsageBuilder, | 963 BackendUsageBuilder backendUsageBuilder, |
| 964 RuntimeTypesNeedBuilder rtiNeedBuilder, |
| 965 NativeResolutionEnqueuer nativeResolutionEnqueuer, |
| 957 SelectorConstraintsStrategy selectorConstraintsStrategy) | 966 SelectorConstraintsStrategy selectorConstraintsStrategy) |
| 958 : super( | 967 : super( |
| 968 options, |
| 959 elementEnvironment, | 969 elementEnvironment, |
| 960 dartTypes, | 970 dartTypes, |
| 961 commonElements, | 971 commonElements, |
| 962 constantSystem, | 972 constantSystem, |
| 963 nativeBasicData, | 973 nativeBasicData, |
| 964 nativeDataBuilder, | 974 nativeDataBuilder, |
| 965 interceptorDataBuilder, | 975 interceptorDataBuilder, |
| 966 backendUsageBuilder, | 976 backendUsageBuilder, |
| 977 rtiNeedBuilder, |
| 978 nativeResolutionEnqueuer, |
| 967 selectorConstraintsStrategy); | 979 selectorConstraintsStrategy); |
| 968 | 980 |
| 969 @override | 981 @override |
| 970 ClosedWorld closeWorld() { | 982 ClosedWorld closeWorld() { |
| 971 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses = | 983 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses = |
| 972 populateHierarchyNodes(); | 984 populateHierarchyNodes(); |
| 973 _classHierarchyNodes.keys.toList().forEach(_ensureClassSet); | 985 _classHierarchyNodes.keys.toList().forEach(_ensureClassSet); |
| 974 _closed = true; | 986 _closed = true; |
| 975 assert( | 987 assert( |
| 976 _classHierarchyNodes.length == _classSets.length, | 988 _classHierarchyNodes.length == _classSets.length, |
| 977 "ClassHierarchyNode/ClassSet mismatch: " | 989 "ClassHierarchyNode/ClassSet mismatch: " |
| 978 "$_classHierarchyNodes vs $_classSets"); | 990 "$_classHierarchyNodes vs $_classSets"); |
| 979 return _closedWorldCache = new KernelClosedWorld(elementMap, | 991 return _closedWorldCache = new KernelClosedWorld(elementMap, |
| 992 options: _options, |
| 980 elementEnvironment: _elementEnvironment, | 993 elementEnvironment: _elementEnvironment, |
| 981 dartTypes: _dartTypes, | 994 dartTypes: _dartTypes, |
| 982 commonElements: _commonElements, | 995 commonElements: _commonElements, |
| 983 nativeData: _nativeDataBuilder.close(), | 996 nativeData: _nativeDataBuilder.close(), |
| 984 interceptorData: _interceptorDataBuilder.close(), | 997 interceptorData: _interceptorDataBuilder.close(), |
| 985 backendUsage: _backendUsageBuilder.close(), | 998 backendUsage: _backendUsageBuilder.close(), |
| 999 resolutionWorldBuilder: this, |
| 1000 rtiNeedBuilder: _rtiNeedBuilder, |
| 986 constantSystem: _constantSystem, | 1001 constantSystem: _constantSystem, |
| 987 implementedClasses: _implementedClasses, | 1002 implementedClasses: _implementedClasses, |
| 1003 liveNativeClasses: _nativeResolutionEnqueuer.liveNativeClasses, |
| 988 liveInstanceMembers: _liveInstanceMembers, | 1004 liveInstanceMembers: _liveInstanceMembers, |
| 989 assignedInstanceMembers: computeAssignedInstanceMembers(), | 1005 assignedInstanceMembers: computeAssignedInstanceMembers(), |
| 990 allTypedefs: _allTypedefs, | 1006 allTypedefs: _allTypedefs, |
| 991 mixinUses: _mixinUses, | 1007 mixinUses: _mixinUses, |
| 992 typesImplementedBySubclasses: typesImplementedBySubclasses, | 1008 typesImplementedBySubclasses: typesImplementedBySubclasses, |
| 993 classHierarchyNodes: _classHierarchyNodes, | 1009 classHierarchyNodes: _classHierarchyNodes, |
| 994 classSets: _classSets); | 1010 classSets: _classSets); |
| 995 } | 1011 } |
| 996 | 1012 |
| 997 @override | 1013 @override |
| 998 void registerClass(ClassEntity cls) { | 1014 void registerClass(ClassEntity cls) { |
| 999 throw new UnimplementedError('KernelResolutionWorldBuilder.registerClass'); | 1015 throw new UnimplementedError('KernelResolutionWorldBuilder.registerClass'); |
| 1000 } | 1016 } |
| 1001 } | 1017 } |
| OLD | NEW |