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 |