| 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 '../cache_strategy.dart'; |
| 9 import '../common.dart'; | 10 import '../common.dart'; |
| 11 import '../common/backend_api.dart' show Backend; |
| 12 import '../common/resolution.dart' show Resolution; |
| 10 import '../compiler.dart' show Compiler; | 13 import '../compiler.dart' show Compiler; |
| 14 import '../core_types.dart' show CoreClasses; |
| 11 import '../dart_types.dart'; | 15 import '../dart_types.dart'; |
| 12 import '../elements/elements.dart'; | 16 import '../elements/elements.dart'; |
| 17 import '../types/masks.dart' show CommonMasks; |
| 13 import '../universe/class_set.dart' show Instantiation; | 18 import '../universe/class_set.dart' show Instantiation; |
| 14 import '../util/enumset.dart'; | 19 import '../util/enumset.dart'; |
| 15 import '../util/util.dart'; | 20 import '../util/util.dart'; |
| 16 import '../world.dart' show World, ClosedWorld, OpenWorld; | 21 import '../world.dart' show World, ClosedWorld, OpenWorld, WorldImpl; |
| 17 import 'selector.dart' show Selector; | 22 import 'selector.dart' show Selector; |
| 18 import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind; | 23 import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind; |
| 19 | 24 |
| 20 /// The known constraint on receiver for a dynamic call site. | 25 /// The known constraint on receiver for a dynamic call site. |
| 21 /// | 26 /// |
| 22 /// This can for instance be used to constrain this dynamic call to `foo` to | 27 /// This can for instance be used to constrain this dynamic call to `foo` to |
| 23 /// 'receivers of the exact instance `Bar`': | 28 /// 'receivers of the exact instance `Bar`': |
| 24 /// | 29 /// |
| 25 /// class Bar { | 30 /// class Bar { |
| 26 /// void foo() {} | 31 /// void foo() {} |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 /// constructor that has been called directly and not only through a | 118 /// constructor that has been called directly and not only through a |
| 114 /// super-call. | 119 /// super-call. |
| 115 // TODO(johnniwinther): Improve semantic precision. | 120 // TODO(johnniwinther): Improve semantic precision. |
| 116 Iterable<ClassElement> get directlyInstantiatedClasses; | 121 Iterable<ClassElement> get directlyInstantiatedClasses; |
| 117 | 122 |
| 118 /// All types that are checked either through is, as or checked mode checks. | 123 /// All types that are checked either through is, as or checked mode checks. |
| 119 Iterable<DartType> get isChecks; | 124 Iterable<DartType> get isChecks; |
| 120 | 125 |
| 121 /// Registers that [type] is checked in this universe. The unaliased type is | 126 /// Registers that [type] is checked in this universe. The unaliased type is |
| 122 /// returned. | 127 /// returned. |
| 123 DartType registerIsCheck(DartType type, Compiler compiler); | 128 DartType registerIsCheck(DartType type, Resolution resolution); |
| 124 | 129 |
| 125 /// All directly instantiated types, that is, the types of the directly | 130 /// All directly instantiated types, that is, the types of the directly |
| 126 /// instantiated classes. | 131 /// instantiated classes. |
| 127 // TODO(johnniwinther): Improve semantic precision. | 132 // TODO(johnniwinther): Improve semantic precision. |
| 128 Iterable<DartType> get instantiatedTypes; | 133 Iterable<DartType> get instantiatedTypes; |
| 129 | 134 |
| 130 /// Returns `true` if [member] is invoked as a setter. | 135 /// Returns `true` if [member] is invoked as a setter. |
| 131 bool hasInvokedSetter(Element member, World world); | 136 bool hasInvokedSetter(Element member, World world); |
| 132 } | 137 } |
| 133 | 138 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 155 /// subtypes. The latter case only contains spurious information from | 160 /// subtypes. The latter case only contains spurious information from |
| 156 /// instantiations through factory constructors and mixins. | 161 /// instantiations through factory constructors and mixins. |
| 157 bool isImplemented(ClassElement cls); | 162 bool isImplemented(ClassElement cls); |
| 158 | 163 |
| 159 /// Set of all fields that are statically known to be written to. | 164 /// Set of all fields that are statically known to be written to. |
| 160 Iterable<Element> get fieldSetters; | 165 Iterable<Element> get fieldSetters; |
| 161 | 166 |
| 162 /// Call [f] for all directly or abstractly instantiated classes. | 167 /// Call [f] for all directly or abstractly instantiated classes. |
| 163 void forEachInstantiatedClass( | 168 void forEachInstantiatedClass( |
| 164 f(ClassElement cls, EnumSet<Instantiation> instantiations)); | 169 f(ClassElement cls, EnumSet<Instantiation> instantiations)); |
| 170 |
| 171 /// `true` of `Object.runtimeType` is supported. |
| 172 bool get hasRuntimeTypeSupport; |
| 173 |
| 174 /// `true` of use of the `dart:isolate` library is supported. |
| 175 bool get hasIsolateSupport; |
| 176 |
| 177 /// `true` of `Function.apply` is supported. |
| 178 bool get hasFunctionApplySupport; |
| 179 |
| 180 /// The [OpenWorld] being created by this world builder. |
| 181 // TODO(johnniwinther): Merge this with [ResolutionWorldBuilder]. |
| 182 OpenWorld get openWorld; |
| 165 } | 183 } |
| 166 | 184 |
| 167 class ResolutionWorldBuilderImpl implements ResolutionWorldBuilder { | 185 class ResolutionWorldBuilderImpl implements ResolutionWorldBuilder { |
| 168 /// The set of all directly instantiated classes, that is, classes with a | 186 /// The set of all directly instantiated classes, that is, classes with a |
| 169 /// generative constructor that has been called directly and not only through | 187 /// generative constructor that has been called directly and not only through |
| 170 /// a super-call. | 188 /// a super-call. |
| 171 /// | 189 /// |
| 172 /// Invariant: Elements are declaration elements. | 190 /// Invariant: Elements are declaration elements. |
| 173 // TODO(johnniwinther): [_directlyInstantiatedClasses] and | 191 // TODO(johnniwinther): [_directlyInstantiatedClasses] and |
| 174 // [_instantiatedTypes] sets should be merged. | 192 // [_instantiatedTypes] sets should be merged. |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 final Set<LocalFunctionElement> allClosures = new Set<LocalFunctionElement>(); | 247 final Set<LocalFunctionElement> allClosures = new Set<LocalFunctionElement>(); |
| 230 | 248 |
| 231 /** | 249 /** |
| 232 * Set of methods in instantiated classes that are potentially | 250 * Set of methods in instantiated classes that are potentially |
| 233 * closurized. | 251 * closurized. |
| 234 */ | 252 */ |
| 235 final Set<Element> closurizedMembers = new Set<Element>(); | 253 final Set<Element> closurizedMembers = new Set<Element>(); |
| 236 | 254 |
| 237 final SelectorConstraintsStrategy selectorConstraintsStrategy; | 255 final SelectorConstraintsStrategy selectorConstraintsStrategy; |
| 238 | 256 |
| 239 ResolutionWorldBuilderImpl(this.selectorConstraintsStrategy); | 257 bool hasRuntimeTypeSupport = false; |
| 258 bool hasIsolateSupport = false; |
| 259 bool hasFunctionApplySupport = false; |
| 260 |
| 261 OpenWorld _openWorld; |
| 262 |
| 263 ResolutionWorldBuilderImpl(Backend backend, CoreClasses coreClasses, |
| 264 CacheStrategy cacheStrategy, this.selectorConstraintsStrategy) { |
| 265 _openWorld = new WorldImpl(this, backend, coreClasses, cacheStrategy); |
| 266 } |
| 267 |
| 268 OpenWorld get openWorld => _openWorld; |
| 240 | 269 |
| 241 /// All directly instantiated classes, that is, classes with a generative | 270 /// All directly instantiated classes, that is, classes with a generative |
| 242 /// constructor that has been called directly and not only through a | 271 /// constructor that has been called directly and not only through a |
| 243 /// super-call. | 272 /// super-call. |
| 244 // TODO(johnniwinther): Improve semantic precision. | 273 // TODO(johnniwinther): Improve semantic precision. |
| 245 Iterable<ClassElement> get directlyInstantiatedClasses { | 274 Iterable<ClassElement> get directlyInstantiatedClasses { |
| 246 return _directlyInstantiatedClasses.keys; | 275 return _directlyInstantiatedClasses.keys; |
| 247 } | 276 } |
| 248 | 277 |
| 249 /// All directly instantiated types, that is, the types of the directly | 278 /// All directly instantiated types, that is, the types of the directly |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 ReceiverConstraint mask = dynamicUse.mask; | 387 ReceiverConstraint mask = dynamicUse.mask; |
| 359 Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent( | 388 Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent( |
| 360 name, () => new Maplet<Selector, SelectorConstraints>()); | 389 name, () => new Maplet<Selector, SelectorConstraints>()); |
| 361 UniverseSelectorConstraints constraints = | 390 UniverseSelectorConstraints constraints = |
| 362 selectors.putIfAbsent(selector, () { | 391 selectors.putIfAbsent(selector, () { |
| 363 return selectorConstraintsStrategy.createSelectorConstraints(selector); | 392 return selectorConstraintsStrategy.createSelectorConstraints(selector); |
| 364 }); | 393 }); |
| 365 return constraints.addReceiverConstraint(mask); | 394 return constraints.addReceiverConstraint(mask); |
| 366 } | 395 } |
| 367 | 396 |
| 368 DartType registerIsCheck(DartType type, Compiler compiler) { | 397 DartType registerIsCheck(DartType type, Resolution resolution) { |
| 369 type.computeUnaliased(compiler.resolution); | 398 type.computeUnaliased(resolution); |
| 370 type = type.unaliased; | 399 type = type.unaliased; |
| 371 // Even in checked mode, type annotations for return type and argument | 400 // Even in checked mode, type annotations for return type and argument |
| 372 // types do not imply type checks, so there should never be a check | 401 // types do not imply type checks, so there should never be a check |
| 373 // against the type variable of a typedef. | 402 // against the type variable of a typedef. |
| 374 isChecks.add(type); | 403 isChecks.add(type); |
| 375 return type; | 404 return type; |
| 376 } | 405 } |
| 377 | 406 |
| 378 void registerStaticUse(StaticUse staticUse) { | 407 void registerStaticUse(StaticUse staticUse) { |
| 379 Element element = staticUse.element; | 408 Element element = staticUse.element; |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 void forEachInvokedGetter( | 666 void forEachInvokedGetter( |
| 638 f(String name, Map<Selector, SelectorConstraints> selectors)) { | 667 f(String name, Map<Selector, SelectorConstraints> selectors)) { |
| 639 _invokedGetters.forEach(f); | 668 _invokedGetters.forEach(f); |
| 640 } | 669 } |
| 641 | 670 |
| 642 void forEachInvokedSetter( | 671 void forEachInvokedSetter( |
| 643 f(String name, Map<Selector, SelectorConstraints> selectors)) { | 672 f(String name, Map<Selector, SelectorConstraints> selectors)) { |
| 644 _invokedSetters.forEach(f); | 673 _invokedSetters.forEach(f); |
| 645 } | 674 } |
| 646 | 675 |
| 647 DartType registerIsCheck(DartType type, Compiler compiler) { | 676 DartType registerIsCheck(DartType type, Resolution resolution) { |
| 648 type.computeUnaliased(compiler.resolution); | |
| 649 type = type.unaliased; | 677 type = type.unaliased; |
| 650 // Even in checked mode, type annotations for return type and argument | 678 // Even in checked mode, type annotations for return type and argument |
| 651 // types do not imply type checks, so there should never be a check | 679 // types do not imply type checks, so there should never be a check |
| 652 // against the type variable of a typedef. | 680 // against the type variable of a typedef. |
| 653 isChecks.add(type); | 681 isChecks.add(type); |
| 654 return type; | 682 return type; |
| 655 } | 683 } |
| 656 | 684 |
| 657 void registerStaticUse(StaticUse staticUse) { | 685 void registerStaticUse(StaticUse staticUse) { |
| 658 Element element = staticUse.element; | 686 Element element = staticUse.element; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 680 | 708 |
| 681 void forgetElement(Element element, Compiler compiler) { | 709 void forgetElement(Element element, Compiler compiler) { |
| 682 _directlyInstantiatedClasses.remove(element); | 710 _directlyInstantiatedClasses.remove(element); |
| 683 if (element is ClassElement) { | 711 if (element is ClassElement) { |
| 684 assert(invariant(element, element.thisType.isRaw, | 712 assert(invariant(element, element.thisType.isRaw, |
| 685 message: 'Generic classes not supported (${element.thisType}).')); | 713 message: 'Generic classes not supported (${element.thisType}).')); |
| 686 _instantiatedTypes..remove(element.rawType)..remove(element.thisType); | 714 _instantiatedTypes..remove(element.rawType)..remove(element.thisType); |
| 687 } | 715 } |
| 688 } | 716 } |
| 689 } | 717 } |
| OLD | NEW |