Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: pkg/compiler/lib/src/universe/universe.dart

Issue 1431513010: Revert "Normalize type masks to use the least upper instantiated subclass/type." (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/compiler/lib/src/universe/function_set.dart ('k') | pkg/compiler/lib/src/world.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 10 import '../compiler.dart' show
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 // [_instantiatedTypes] sets should be merged. 117 // [_instantiatedTypes] sets should be merged.
118 final Set<ClassElement> _directlyInstantiatedClasses = 118 final Set<ClassElement> _directlyInstantiatedClasses =
119 new Set<ClassElement>(); 119 new Set<ClassElement>();
120 120
121 /// The set of all directly instantiated types, that is, the types of the 121 /// The set of all directly instantiated types, that is, the types of the
122 /// directly instantiated classes. 122 /// directly instantiated classes.
123 /// 123 ///
124 /// See [_directlyInstantiatedClasses]. 124 /// See [_directlyInstantiatedClasses].
125 final Set<DartType> _instantiatedTypes = new Set<DartType>(); 125 final Set<DartType> _instantiatedTypes = new Set<DartType>();
126 126
127 /// The set of all instantiated classes, either directly, as superclasses or
128 /// as supertypes.
129 ///
130 /// Invariant: Elements are declaration elements.
131 final Set<ClassElement> _allInstantiatedClasses = new Set<ClassElement>();
132
127 /// Classes implemented by directly instantiated classes. 133 /// Classes implemented by directly instantiated classes.
128 final Set<ClassElement> _implementedClasses = new Set<ClassElement>(); 134 final Set<ClassElement> _implementedClasses = new Set<ClassElement>();
129 135
130 /// The set of all referenced static fields. 136 /// The set of all referenced static fields.
131 /// 137 ///
132 /// Invariant: Elements are declaration elements. 138 /// Invariant: Elements are declaration elements.
133 final Set<FieldElement> allReferencedStaticFields = new Set<FieldElement>(); 139 final Set<FieldElement> allReferencedStaticFields = new Set<FieldElement>();
134 140
135 /** 141 /**
136 * Documentation wanted -- johnniwinther 142 * Documentation wanted -- johnniwinther
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 Universe(this.selectorConstraintsStrategy); 199 Universe(this.selectorConstraintsStrategy);
194 200
195 /// All directly instantiated classes, that is, classes with a generative 201 /// All directly instantiated classes, that is, classes with a generative
196 /// constructor that has been called directly and not only through a 202 /// constructor that has been called directly and not only through a
197 /// super-call. 203 /// super-call.
198 // TODO(johnniwinther): Improve semantic precision. 204 // TODO(johnniwinther): Improve semantic precision.
199 Iterable<ClassElement> get directlyInstantiatedClasses { 205 Iterable<ClassElement> get directlyInstantiatedClasses {
200 return _directlyInstantiatedClasses; 206 return _directlyInstantiatedClasses;
201 } 207 }
202 208
209 /// All instantiated classes, either directly, as superclasses or as
210 /// supertypes.
211 // TODO(johnniwinther): Improve semantic precision.
212 Iterable<ClassElement> get allInstantiatedClasses {
213 return _allInstantiatedClasses;
214 }
215
203 /// All directly instantiated types, that is, the types of the directly 216 /// All directly instantiated types, that is, the types of the directly
204 /// instantiated classes. 217 /// instantiated classes.
205 /// 218 ///
206 /// See [directlyInstantiatedClasses]. 219 /// See [directlyInstantiatedClasses].
207 // TODO(johnniwinther): Improve semantic precision. 220 // TODO(johnniwinther): Improve semantic precision.
208 Iterable<DartType> get instantiatedTypes => _instantiatedTypes; 221 Iterable<DartType> get instantiatedTypes => _instantiatedTypes;
209 222
223 /// Returns `true` if [cls] is considered to be instantiated, either directly,
224 /// through subclasses.
225 // TODO(johnniwinther): Improve semantic precision.
226 bool isInstantiated(ClassElement cls) {
227 return _allInstantiatedClasses.contains(cls.declaration);
228 }
229
210 /// Returns `true` if [cls] is considered to be implemented by an 230 /// Returns `true` if [cls] is considered to be implemented by an
211 /// instantiated class, either directly, through subclasses or through 231 /// instantiated class, either directly, through subclasses or through
212 /// subtypes. The latter case only contains spurious information from 232 /// subtypes. The latter case only contains spurious information from
213 /// instantiations through factory constructors and mixins. 233 /// instantiations through factory constructors and mixins.
214 // TODO(johnniwinther): Improve semantic precision. 234 // TODO(johnniwinther): Improve semantic precision.
215 bool isImplemented(ClassElement cls) { 235 bool isImplemented(ClassElement cls) {
216 return _implementedClasses.contains(cls.declaration); 236 return _implementedClasses.contains(cls.declaration);
217 } 237 }
218 238
219 /// Register [type] as (directly) instantiated. 239 /// Register [type] as (directly) instantiated.
(...skipping 24 matching lines...) Expand all
244 // TODO(johnniwinther): Replace this by separate more specific mappings that 264 // TODO(johnniwinther): Replace this by separate more specific mappings that
245 // include the type arguments. 265 // include the type arguments.
246 if (_implementedClasses.add(cls)) { 266 if (_implementedClasses.add(cls)) {
247 onImplemented(cls); 267 onImplemented(cls);
248 cls.allSupertypes.forEach((InterfaceType supertype) { 268 cls.allSupertypes.forEach((InterfaceType supertype) {
249 if (_implementedClasses.add(supertype.element)) { 269 if (_implementedClasses.add(supertype.element)) {
250 onImplemented(supertype.element); 270 onImplemented(supertype.element);
251 } 271 }
252 }); 272 });
253 } 273 }
274 while (cls != null) {
275 if (!_allInstantiatedClasses.add(cls)) {
276 return;
277 }
278 cls = cls.superclass;
279 }
254 } 280 }
255 281
256 bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors, 282 bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
257 Element member, 283 Element member,
258 World world) { 284 World world) {
259 if (selectors == null) return false; 285 if (selectors == null) return false;
260 for (Selector selector in selectors.keys) { 286 for (Selector selector in selectors.keys) {
261 if (selector.appliesUnnamed(member, world)) { 287 if (selector.appliesUnnamed(member, world)) {
262 SelectorConstraints masks = selectors[selector]; 288 SelectorConstraints masks = selectors[selector];
263 if (masks.applies(member, selector, world)) { 289 if (masks.applies(member, selector, world)) {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 } 396 }
371 } 397 }
372 398
373 void forgetElement(Element element, Compiler compiler) { 399 void forgetElement(Element element, Compiler compiler) {
374 allClosures.remove(element); 400 allClosures.remove(element);
375 slowDirectlyNestedClosures(element).forEach(compiler.forgetElement); 401 slowDirectlyNestedClosures(element).forEach(compiler.forgetElement);
376 closurizedMembers.remove(element); 402 closurizedMembers.remove(element);
377 fieldSetters.remove(element); 403 fieldSetters.remove(element);
378 fieldGetters.remove(element); 404 fieldGetters.remove(element);
379 _directlyInstantiatedClasses.remove(element); 405 _directlyInstantiatedClasses.remove(element);
406 _allInstantiatedClasses.remove(element);
380 if (element is ClassElement) { 407 if (element is ClassElement) {
381 assert(invariant( 408 assert(invariant(
382 element, element.thisType.isRaw, 409 element, element.thisType.isRaw,
383 message: 'Generic classes not supported (${element.thisType}).')); 410 message: 'Generic classes not supported (${element.thisType}).'));
384 _instantiatedTypes 411 _instantiatedTypes
385 ..remove(element.rawType) 412 ..remove(element.rawType)
386 ..remove(element.thisType); 413 ..remove(element.thisType);
387 } 414 }
388 } 415 }
389 416
390 // TODO(ahe): Replace this method with something that is O(1), for example, 417 // TODO(ahe): Replace this method with something that is O(1), for example,
391 // by using a map. 418 // by using a map.
392 List<LocalFunctionElement> slowDirectlyNestedClosures(Element element) { 419 List<LocalFunctionElement> slowDirectlyNestedClosures(Element element) {
393 // Return new list to guard against concurrent modifications. 420 // Return new list to guard against concurrent modifications.
394 return new List<LocalFunctionElement>.from( 421 return new List<LocalFunctionElement>.from(
395 allClosures.where((LocalFunctionElement closure) { 422 allClosures.where((LocalFunctionElement closure) {
396 return closure.executableContext == element; 423 return closure.executableContext == element;
397 })); 424 }));
398 } 425 }
399 } 426 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/universe/function_set.dart ('k') | pkg/compiler/lib/src/world.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698