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

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

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