Chromium Code Reviews| 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 universe; | 5 library universe; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import '../common.dart'; | 9 import '../common.dart'; |
| 10 import '../compiler.dart' show Compiler; | 10 import '../compiler.dart' show Compiler; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 /// | 80 /// |
| 81 /// class A {} | 81 /// class A {} |
| 82 /// class B { foo() {} } | 82 /// class B { foo() {} } |
| 83 /// m(b) => (b ? new A() : new B()).foo(); | 83 /// m(b) => (b ? new A() : new B()).foo(); |
| 84 /// | 84 /// |
| 85 /// the potential receiver `new A()` has no implementation of `foo` and thus | 85 /// the potential receiver `new A()` has no implementation of `foo` and thus |
| 86 /// needs to handle the call through its `noSuchMethod` handler. | 86 /// needs to handle the call through its `noSuchMethod` handler. |
| 87 bool needsNoSuchMethodHandling(Selector selector, World world); | 87 bool needsNoSuchMethodHandling(Selector selector, World world); |
| 88 } | 88 } |
| 89 | 89 |
| 90 /// A mutable [SelectorConstraints] used in [Universe]. | 90 /// A mutable [SelectorConstraints] used in [WorldBuilder]. |
| 91 abstract class UniverseSelectorConstraints extends SelectorConstraints { | 91 abstract class UniverseSelectorConstraints extends SelectorConstraints { |
| 92 /// Adds [constraint] to these selector constraints. Return `true` if the set | 92 /// Adds [constraint] to these selector constraints. Return `true` if the set |
| 93 /// of potential receivers expanded due to the new constraint. | 93 /// of potential receivers expanded due to the new constraint. |
| 94 bool addReceiverConstraint(ReceiverConstraint constraint); | 94 bool addReceiverConstraint(ReceiverConstraint constraint); |
| 95 } | 95 } |
| 96 | 96 |
| 97 /// Strategy for computing the constraints on potential receivers of dynamic | 97 /// Strategy for computing the constraints on potential receivers of dynamic |
| 98 /// call sites. | 98 /// call sites. |
| 99 abstract class SelectorConstraintsStrategy { | 99 abstract class SelectorConstraintsStrategy { |
| 100 /// Create a [UniverseSelectorConstraints] to represent the global receiver | 100 /// Create a [UniverseSelectorConstraints] to represent the global receiver |
| 101 /// constraints for dynamic call sites with [selector]. | 101 /// constraints for dynamic call sites with [selector]. |
| 102 UniverseSelectorConstraints createSelectorConstraints(Selector selector); | 102 UniverseSelectorConstraints createSelectorConstraints(Selector selector); |
| 103 } | 103 } |
| 104 | 104 |
| 105 /// The [Universe] is an auxiliary class used in the process of computing the | 105 /// The [WorldBuilder] is an auxiliary class used in the process of computing |
| 106 /// [ClosedWorld]. The concepts here and in [ClosedWorld] are very similar -- in | 106 /// the [ClosedWorld]. The concepts here and in [ClosedWorld] are very similar |
|
Siggi Cherem (dart-lang)
2016/09/29 18:14:48
nit: remove everything after the first sentence
| |
| 107 /// the same way that the "universe expands" you can think of this as a mutable | 107 /// -- in the same way that the "universe expands" you can think of this as a |
| 108 /// world that is expanding as we visit and discover parts of the program. | 108 /// mutable world that is expanding as we visit and discover parts of the |
| 109 /// program. | |
| 109 // TODO(sigmund): rename to "growing/expanding/mutable world"? | 110 // TODO(sigmund): rename to "growing/expanding/mutable world"? |
|
Siggi Cherem (dart-lang)
2016/09/29 18:14:48
remove TODO :)
Johnni Winther
2016/09/30 08:43:14
Done.
| |
| 110 // TODO(johnniwinther): Move common implementation to a [UniverseBase] when | 111 // TODO(johnniwinther): Move common implementation to a [UniverseBase] when |
| 111 // universes and worlds have been unified. | 112 // universes and worlds have been unified. |
| 112 abstract class Universe { | 113 abstract class WorldBuilder { |
| 113 /// All directly instantiated classes, that is, classes with a generative | 114 /// All directly instantiated classes, that is, classes with a generative |
| 114 /// constructor that has been called directly and not only through a | 115 /// constructor that has been called directly and not only through a |
| 115 /// super-call. | 116 /// super-call. |
| 116 // TODO(johnniwinther): Improve semantic precision. | 117 // TODO(johnniwinther): Improve semantic precision. |
| 117 Iterable<ClassElement> get directlyInstantiatedClasses; | 118 Iterable<ClassElement> get directlyInstantiatedClasses; |
| 118 | 119 |
| 119 /// All types that are checked either through is, as or checked mode checks. | 120 /// All types that are checked either through is, as or checked mode checks. |
| 120 Iterable<DartType> get isChecks; | 121 Iterable<DartType> get isChecks; |
| 121 | 122 |
| 122 /// Registers that [type] is checked in this universe. The unaliased type is | 123 /// Registers that [type] is checked in this universe. The unaliased type is |
| 123 /// returned. | 124 /// returned. |
| 124 DartType registerIsCheck(DartType type, Compiler compiler); | 125 DartType registerIsCheck(DartType type, Compiler compiler); |
| 125 | 126 |
| 126 /// All directly instantiated types, that is, the types of the directly | 127 /// All directly instantiated types, that is, the types of the directly |
| 127 /// instantiated classes. | 128 /// instantiated classes. |
| 128 // TODO(johnniwinther): Improve semantic precision. | 129 // TODO(johnniwinther): Improve semantic precision. |
| 129 Iterable<DartType> get instantiatedTypes; | 130 Iterable<DartType> get instantiatedTypes; |
| 130 | 131 |
| 131 /// Returns `true` if [member] is invoked as a setter. | 132 /// Returns `true` if [member] is invoked as a setter. |
| 132 bool hasInvokedSetter(Element member, World world); | 133 bool hasInvokedSetter(Element member, World world); |
| 133 } | 134 } |
| 134 | 135 |
| 135 abstract class ResolutionUniverse implements Universe { | 136 abstract class ResolutionWorldBuilder implements WorldBuilder { |
| 136 /// Set of (live) local functions (closures) whose signatures reference type | 137 /// Set of (live) local functions (closures) whose signatures reference type |
| 137 /// variables. | 138 /// variables. |
| 138 /// | 139 /// |
| 139 /// A live function is one whose enclosing member function has been enqueued. | 140 /// A live function is one whose enclosing member function has been enqueued. |
| 140 Set<Element> get closuresWithFreeTypeVariables; | 141 Set<Element> get closuresWithFreeTypeVariables; |
| 141 | 142 |
| 142 /// Set of (live) `call` methods whose signatures reference type variables. | 143 /// Set of (live) `call` methods whose signatures reference type variables. |
| 143 /// | 144 /// |
| 144 /// A live `call` method is one whose enclosing class has been instantiated. | 145 /// A live `call` method is one whose enclosing class has been instantiated. |
| 145 Iterable<Element> get callMethodsWithFreeTypeVariables; | 146 Iterable<Element> get callMethodsWithFreeTypeVariables; |
| 146 | 147 |
| 147 /// Set of all closures in the program. Used by the mirror tracking system | 148 /// Set of all closures in the program. Used by the mirror tracking system |
| 148 /// to find all live closure instances. | 149 /// to find all live closure instances. |
| 149 Iterable<LocalFunctionElement> get allClosures; | 150 Iterable<LocalFunctionElement> get allClosures; |
| 150 | 151 |
| 151 /// Set of methods in instantiated classes that are potentially closurized. | 152 /// Set of methods in instantiated classes that are potentially closurized. |
| 152 Iterable<Element> get closurizedMembers; | 153 Iterable<Element> get closurizedMembers; |
| 153 | 154 |
| 154 /// Returns `true` if [cls] is considered to be implemented by an | 155 /// Returns `true` if [cls] is considered to be implemented by an |
| 155 /// instantiated class, either directly, through subclasses or through | 156 /// instantiated class, either directly, through subclasses or through |
| 156 /// subtypes. The latter case only contains spurious information from | 157 /// subtypes. The latter case only contains spurious information from |
| 157 /// instantiations through factory constructors and mixins. | 158 /// instantiations through factory constructors and mixins. |
| 158 bool isImplemented(ClassElement cls); | 159 bool isImplemented(ClassElement cls); |
| 159 | 160 |
| 160 /// Set of all fields that are statically known to be written to. | 161 /// Set of all fields that are statically known to be written to. |
| 161 Iterable<Element> get fieldSetters; | 162 Iterable<Element> get fieldSetters; |
| 162 } | 163 } |
| 163 | 164 |
| 164 class ResolutionUniverseImpl implements ResolutionUniverse { | 165 class ResolutionWorldBuilderImpl implements ResolutionWorldBuilder { |
| 165 /// The set of all directly instantiated classes, that is, classes with a | 166 /// The set of all directly instantiated classes, that is, classes with a |
| 166 /// generative constructor that has been called directly and not only through | 167 /// generative constructor that has been called directly and not only through |
| 167 /// a super-call. | 168 /// a super-call. |
| 168 /// | 169 /// |
| 169 /// Invariant: Elements are declaration elements. | 170 /// Invariant: Elements are declaration elements. |
| 170 // TODO(johnniwinther): [_directlyInstantiatedClasses] and | 171 // TODO(johnniwinther): [_directlyInstantiatedClasses] and |
| 171 // [_instantiatedTypes] sets should be merged. | 172 // [_instantiatedTypes] sets should be merged. |
| 172 final Set<ClassElement> _directlyInstantiatedClasses = | 173 final Set<ClassElement> _directlyInstantiatedClasses = |
| 173 new Set<ClassElement>(); | 174 new Set<ClassElement>(); |
| 174 | 175 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 226 final Set<LocalFunctionElement> allClosures = new Set<LocalFunctionElement>(); | 227 final Set<LocalFunctionElement> allClosures = new Set<LocalFunctionElement>(); |
| 227 | 228 |
| 228 /** | 229 /** |
| 229 * Set of methods in instantiated classes that are potentially | 230 * Set of methods in instantiated classes that are potentially |
| 230 * closurized. | 231 * closurized. |
| 231 */ | 232 */ |
| 232 final Set<Element> closurizedMembers = new Set<Element>(); | 233 final Set<Element> closurizedMembers = new Set<Element>(); |
| 233 | 234 |
| 234 final SelectorConstraintsStrategy selectorConstraintsStrategy; | 235 final SelectorConstraintsStrategy selectorConstraintsStrategy; |
| 235 | 236 |
| 236 ResolutionUniverseImpl(this.selectorConstraintsStrategy); | 237 ResolutionWorldBuilderImpl(this.selectorConstraintsStrategy); |
| 237 | 238 |
| 238 /// All directly instantiated classes, that is, classes with a generative | 239 /// All directly instantiated classes, that is, classes with a generative |
| 239 /// constructor that has been called directly and not only through a | 240 /// constructor that has been called directly and not only through a |
| 240 /// super-call. | 241 /// super-call. |
| 241 // TODO(johnniwinther): Improve semantic precision. | 242 // TODO(johnniwinther): Improve semantic precision. |
| 242 Iterable<ClassElement> get directlyInstantiatedClasses { | 243 Iterable<ClassElement> get directlyInstantiatedClasses { |
| 243 return _directlyInstantiatedClasses; | 244 return _directlyInstantiatedClasses; |
| 244 } | 245 } |
| 245 | 246 |
| 246 /// All directly instantiated types, that is, the types of the directly | 247 /// All directly instantiated types, that is, the types of the directly |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 // by using a map. | 401 // by using a map. |
| 401 List<LocalFunctionElement> slowDirectlyNestedClosures(Element element) { | 402 List<LocalFunctionElement> slowDirectlyNestedClosures(Element element) { |
| 402 // Return new list to guard against concurrent modifications. | 403 // Return new list to guard against concurrent modifications. |
| 403 return new List<LocalFunctionElement>.from( | 404 return new List<LocalFunctionElement>.from( |
| 404 allClosures.where((LocalFunctionElement closure) { | 405 allClosures.where((LocalFunctionElement closure) { |
| 405 return closure.executableContext == element; | 406 return closure.executableContext == element; |
| 406 })); | 407 })); |
| 407 } | 408 } |
| 408 } | 409 } |
| 409 | 410 |
| 410 /// Universe specific to codegen. | 411 /// World builder specific to codegen. |
| 411 /// | 412 /// |
| 412 /// This adds additional access to liveness of selectors and elements. | 413 /// This adds additional access to liveness of selectors and elements. |
| 413 abstract class CodegenUniverse implements Universe { | 414 abstract class CodegenWorldBuilder implements WorldBuilder { |
| 414 void forEachInvokedName( | 415 void forEachInvokedName( |
| 415 f(String name, Map<Selector, SelectorConstraints> selectors)); | 416 f(String name, Map<Selector, SelectorConstraints> selectors)); |
| 416 | 417 |
| 417 void forEachInvokedGetter( | 418 void forEachInvokedGetter( |
| 418 f(String name, Map<Selector, SelectorConstraints> selectors)); | 419 f(String name, Map<Selector, SelectorConstraints> selectors)); |
| 419 | 420 |
| 420 void forEachInvokedSetter( | 421 void forEachInvokedSetter( |
| 421 f(String name, Map<Selector, SelectorConstraints> selectors)); | 422 f(String name, Map<Selector, SelectorConstraints> selectors)); |
| 422 | 423 |
| 423 bool hasInvokedGetter(Element member, ClosedWorld world); | 424 bool hasInvokedGetter(Element member, ClosedWorld world); |
| 424 | 425 |
| 425 Map<Selector, SelectorConstraints> invocationsByName(String name); | 426 Map<Selector, SelectorConstraints> invocationsByName(String name); |
| 426 | 427 |
| 427 Map<Selector, SelectorConstraints> getterInvocationsByName(String name); | 428 Map<Selector, SelectorConstraints> getterInvocationsByName(String name); |
| 428 | 429 |
| 429 Map<Selector, SelectorConstraints> setterInvocationsByName(String name); | 430 Map<Selector, SelectorConstraints> setterInvocationsByName(String name); |
| 430 | 431 |
| 431 Iterable<FunctionElement> get staticFunctionsNeedingGetter; | 432 Iterable<FunctionElement> get staticFunctionsNeedingGetter; |
| 432 Iterable<FunctionElement> get methodsNeedingSuperGetter; | 433 Iterable<FunctionElement> get methodsNeedingSuperGetter; |
| 433 | 434 |
| 434 /// The set of all referenced static fields. | 435 /// The set of all referenced static fields. |
| 435 /// | 436 /// |
| 436 /// Invariant: Elements are declaration elements. | 437 /// Invariant: Elements are declaration elements. |
| 437 Iterable<FieldElement> get allReferencedStaticFields; | 438 Iterable<FieldElement> get allReferencedStaticFields; |
| 438 } | 439 } |
| 439 | 440 |
| 440 class CodegenUniverseImpl implements CodegenUniverse { | 441 class CodegenWorldBuilderImpl implements CodegenWorldBuilder { |
| 441 /// The set of all directly instantiated classes, that is, classes with a | 442 /// The set of all directly instantiated classes, that is, classes with a |
| 442 /// generative constructor that has been called directly and not only through | 443 /// generative constructor that has been called directly and not only through |
| 443 /// a super-call. | 444 /// a super-call. |
| 444 /// | 445 /// |
| 445 /// Invariant: Elements are declaration elements. | 446 /// Invariant: Elements are declaration elements. |
| 446 // TODO(johnniwinther): [_directlyInstantiatedClasses] and | 447 // TODO(johnniwinther): [_directlyInstantiatedClasses] and |
| 447 // [_instantiatedTypes] sets should be merged. | 448 // [_instantiatedTypes] sets should be merged. |
| 448 final Set<ClassElement> _directlyInstantiatedClasses = | 449 final Set<ClassElement> _directlyInstantiatedClasses = |
| 449 new Set<ClassElement>(); | 450 new Set<ClassElement>(); |
| 450 | 451 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 475 <String, Map<Selector, SelectorConstraints>>{}; | 476 <String, Map<Selector, SelectorConstraints>>{}; |
| 476 final Map<String, Map<Selector, SelectorConstraints>> _invokedGetters = | 477 final Map<String, Map<Selector, SelectorConstraints>> _invokedGetters = |
| 477 <String, Map<Selector, SelectorConstraints>>{}; | 478 <String, Map<Selector, SelectorConstraints>>{}; |
| 478 final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters = | 479 final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters = |
| 479 <String, Map<Selector, SelectorConstraints>>{}; | 480 <String, Map<Selector, SelectorConstraints>>{}; |
| 480 | 481 |
| 481 final Set<DartType> isChecks = new Set<DartType>(); | 482 final Set<DartType> isChecks = new Set<DartType>(); |
| 482 | 483 |
| 483 final SelectorConstraintsStrategy selectorConstraintsStrategy; | 484 final SelectorConstraintsStrategy selectorConstraintsStrategy; |
| 484 | 485 |
| 485 CodegenUniverseImpl(this.selectorConstraintsStrategy); | 486 CodegenWorldBuilderImpl(this.selectorConstraintsStrategy); |
| 486 | 487 |
| 487 /// All directly instantiated classes, that is, classes with a generative | 488 /// All directly instantiated classes, that is, classes with a generative |
| 488 /// constructor that has been called directly and not only through a | 489 /// constructor that has been called directly and not only through a |
| 489 /// super-call. | 490 /// super-call. |
| 490 // TODO(johnniwinther): Improve semantic precision. | 491 // TODO(johnniwinther): Improve semantic precision. |
| 491 Iterable<ClassElement> get directlyInstantiatedClasses { | 492 Iterable<ClassElement> get directlyInstantiatedClasses { |
| 492 return _directlyInstantiatedClasses; | 493 return _directlyInstantiatedClasses; |
| 493 } | 494 } |
| 494 | 495 |
| 495 /// All directly instantiated types, that is, the types of the directly | 496 /// All directly instantiated types, that is, the types of the directly |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 656 | 657 |
| 657 void forgetElement(Element element, Compiler compiler) { | 658 void forgetElement(Element element, Compiler compiler) { |
| 658 _directlyInstantiatedClasses.remove(element); | 659 _directlyInstantiatedClasses.remove(element); |
| 659 if (element is ClassElement) { | 660 if (element is ClassElement) { |
| 660 assert(invariant(element, element.thisType.isRaw, | 661 assert(invariant(element, element.thisType.isRaw, |
| 661 message: 'Generic classes not supported (${element.thisType}).')); | 662 message: 'Generic classes not supported (${element.thisType}).')); |
| 662 _instantiatedTypes..remove(element.rawType)..remove(element.thisType); | 663 _instantiatedTypes..remove(element.rawType)..remove(element.thisType); |
| 663 } | 664 } |
| 664 } | 665 } |
| 665 } | 666 } |
| OLD | NEW |