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

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

Issue 2320583002: Introduce OpenWorld. (Closed)
Patch Set: Created 4 years, 3 months 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
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 Compiler; 10 import '../compiler.dart' show Compiler;
11 import '../dart_types.dart'; 11 import '../dart_types.dart';
12 import '../elements/elements.dart'; 12 import '../elements/elements.dart';
13 import '../util/util.dart'; 13 import '../util/util.dart';
14 import '../world.dart' show ClassWorld, World; 14 import '../world.dart' show ClassWorld, ClosedWorld, OpenWorld;
15 import 'selector.dart' show Selector; 15 import 'selector.dart' show Selector;
16 import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind; 16 import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
17 17
18 /// The known constraint on receiver for a dynamic call site. 18 /// The known constraint on receiver for a dynamic call site.
19 /// 19 ///
20 /// This can for instance be used to constrain this dynamic call to `foo` to 20 /// This can for instance be used to constrain this dynamic call to `foo` to
21 /// 'receivers of the exact instance `Bar`': 21 /// 'receivers of the exact instance `Bar`':
22 /// 22 ///
23 /// class Bar { 23 /// class Bar {
24 /// void foo() {} 24 /// void foo() {}
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 /// Registers that [type] is checked in this universe. The unaliased type is 120 /// Registers that [type] is checked in this universe. The unaliased type is
121 /// returned. 121 /// returned.
122 DartType registerIsCheck(DartType type, Compiler compiler); 122 DartType registerIsCheck(DartType type, Compiler compiler);
123 123
124 /// All directly instantiated types, that is, the types of the directly 124 /// All directly instantiated types, that is, the types of the directly
125 /// instantiated classes. 125 /// instantiated classes.
126 // TODO(johnniwinther): Improve semantic precision. 126 // TODO(johnniwinther): Improve semantic precision.
127 Iterable<DartType> get instantiatedTypes; 127 Iterable<DartType> get instantiatedTypes;
128 128
129 /// Returns `true` if [member] is invoked as a setter. 129 /// Returns `true` if [member] is invoked as a setter.
130 bool hasInvokedSetter(Element member, World world); 130 bool hasInvokedSetter(Element member, ClassWorld world);
131 } 131 }
132 132
133 abstract class ResolutionUniverse implements Universe { 133 abstract class ResolutionUniverse implements Universe {
134 /// Set of (live) local functions (closures) whose signatures reference type 134 /// Set of (live) local functions (closures) whose signatures reference type
135 /// variables. 135 /// variables.
136 /// 136 ///
137 /// A live function is one whose enclosing member function has been enqueued. 137 /// A live function is one whose enclosing member function has been enqueued.
138 Set<Element> get closuresWithFreeTypeVariables; 138 Set<Element> get closuresWithFreeTypeVariables;
139 139
140 /// Set of (live) `call` methods whose signatures reference type variables. 140 /// Set of (live) `call` methods whose signatures reference type variables.
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 onImplemented(cls); 291 onImplemented(cls);
292 cls.allSupertypes.forEach((InterfaceType supertype) { 292 cls.allSupertypes.forEach((InterfaceType supertype) {
293 if (_implementedClasses.add(supertype.element)) { 293 if (_implementedClasses.add(supertype.element)) {
294 onImplemented(supertype.element); 294 onImplemented(supertype.element);
295 } 295 }
296 }); 296 });
297 } 297 }
298 } 298 }
299 299
300 bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors, 300 bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
301 Element member, World world) { 301 Element member, ClassWorld world) {
302 if (selectors == null) return false; 302 if (selectors == null) return false;
303 for (Selector selector in selectors.keys) { 303 for (Selector selector in selectors.keys) {
304 if (selector.appliesUnnamed(member, world)) { 304 if (selector.appliesUnnamed(member, world.backend)) {
305 SelectorConstraints masks = selectors[selector]; 305 SelectorConstraints masks = selectors[selector];
306 if (masks.applies(member, selector, world)) { 306 if (masks.applies(member, selector, world)) {
307 return true; 307 return true;
308 } 308 }
309 } 309 }
310 } 310 }
311 return false; 311 return false;
312 } 312 }
313 313
314 bool hasInvocation(Element member, World world) { 314 bool hasInvocation(Element member, OpenWorld world) {
315 return _hasMatchingSelector(_invokedNames[member.name], member, world); 315 return _hasMatchingSelector(_invokedNames[member.name], member, world);
316 } 316 }
317 317
318 bool hasInvokedGetter(Element member, World world) { 318 bool hasInvokedGetter(Element member, OpenWorld world) {
319 return _hasMatchingSelector(_invokedGetters[member.name], member, world) || 319 return _hasMatchingSelector(_invokedGetters[member.name], member, world) ||
320 member.isFunction && methodsNeedingSuperGetter.contains(member); 320 member.isFunction && methodsNeedingSuperGetter.contains(member);
321 } 321 }
322 322
323 bool hasInvokedSetter(Element member, World world) { 323 bool hasInvokedSetter(Element member, OpenWorld world) {
324 return _hasMatchingSelector(_invokedSetters[member.name], member, world); 324 return _hasMatchingSelector(_invokedSetters[member.name], member, world);
325 } 325 }
326 326
327 bool registerDynamicUse(DynamicUse dynamicUse) { 327 bool registerDynamicUse(DynamicUse dynamicUse) {
328 switch (dynamicUse.kind) { 328 switch (dynamicUse.kind) {
329 case DynamicUseKind.INVOKE: 329 case DynamicUseKind.INVOKE:
330 return _registerNewSelector(dynamicUse, _invokedNames); 330 return _registerNewSelector(dynamicUse, _invokedNames);
331 case DynamicUseKind.GET: 331 case DynamicUseKind.GET:
332 return _registerNewSelector(dynamicUse, _invokedGetters); 332 return _registerNewSelector(dynamicUse, _invokedGetters);
333 case DynamicUseKind.SET: 333 case DynamicUseKind.SET:
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 abstract class CodegenUniverse implements Universe { 409 abstract class CodegenUniverse implements Universe {
410 void forEachInvokedName( 410 void forEachInvokedName(
411 f(String name, Map<Selector, SelectorConstraints> selectors)); 411 f(String name, Map<Selector, SelectorConstraints> selectors));
412 412
413 void forEachInvokedGetter( 413 void forEachInvokedGetter(
414 f(String name, Map<Selector, SelectorConstraints> selectors)); 414 f(String name, Map<Selector, SelectorConstraints> selectors));
415 415
416 void forEachInvokedSetter( 416 void forEachInvokedSetter(
417 f(String name, Map<Selector, SelectorConstraints> selectors)); 417 f(String name, Map<Selector, SelectorConstraints> selectors));
418 418
419 bool hasInvokedGetter(Element member, World world); 419 bool hasInvokedGetter(Element member, ClosedWorld world);
420 420
421 Map<Selector, SelectorConstraints> invocationsByName(String name); 421 Map<Selector, SelectorConstraints> invocationsByName(String name);
422 422
423 Map<Selector, SelectorConstraints> getterInvocationsByName(String name); 423 Map<Selector, SelectorConstraints> getterInvocationsByName(String name);
424 424
425 Map<Selector, SelectorConstraints> setterInvocationsByName(String name); 425 Map<Selector, SelectorConstraints> setterInvocationsByName(String name);
426 426
427 Iterable<FunctionElement> get staticFunctionsNeedingGetter; 427 Iterable<FunctionElement> get staticFunctionsNeedingGetter;
428 Iterable<FunctionElement> get methodsNeedingSuperGetter; 428 Iterable<FunctionElement> get methodsNeedingSuperGetter;
429 429
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 onImplemented(cls); 528 onImplemented(cls);
529 cls.allSupertypes.forEach((InterfaceType supertype) { 529 cls.allSupertypes.forEach((InterfaceType supertype) {
530 if (_implementedClasses.add(supertype.element)) { 530 if (_implementedClasses.add(supertype.element)) {
531 onImplemented(supertype.element); 531 onImplemented(supertype.element);
532 } 532 }
533 }); 533 });
534 } 534 }
535 } 535 }
536 536
537 bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors, 537 bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
538 Element member, World world) { 538 Element member, ClosedWorld world) {
539 if (selectors == null) return false; 539 if (selectors == null) return false;
540 for (Selector selector in selectors.keys) { 540 for (Selector selector in selectors.keys) {
541 if (selector.appliesUnnamed(member, world)) { 541 if (selector.appliesUnnamed(member, world.backend)) {
542 SelectorConstraints masks = selectors[selector]; 542 SelectorConstraints masks = selectors[selector];
543 if (masks.applies(member, selector, world)) { 543 if (masks.applies(member, selector, world)) {
544 return true; 544 return true;
545 } 545 }
546 } 546 }
547 } 547 }
548 return false; 548 return false;
549 } 549 }
550 550
551 bool hasInvocation(Element member, World world) { 551 bool hasInvocation(Element member, ClosedWorld world) {
552 return _hasMatchingSelector(_invokedNames[member.name], member, world); 552 return _hasMatchingSelector(_invokedNames[member.name], member, world);
553 } 553 }
554 554
555 bool hasInvokedGetter(Element member, World world) { 555 bool hasInvokedGetter(Element member, ClosedWorld world) {
556 return _hasMatchingSelector(_invokedGetters[member.name], member, world) || 556 return _hasMatchingSelector(_invokedGetters[member.name], member, world) ||
557 member.isFunction && methodsNeedingSuperGetter.contains(member); 557 member.isFunction && methodsNeedingSuperGetter.contains(member);
558 } 558 }
559 559
560 bool hasInvokedSetter(Element member, World world) { 560 bool hasInvokedSetter(Element member, ClosedWorld world) {
561 return _hasMatchingSelector(_invokedSetters[member.name], member, world); 561 return _hasMatchingSelector(_invokedSetters[member.name], member, world);
562 } 562 }
563 563
564 bool registerDynamicUse(DynamicUse dynamicUse) { 564 bool registerDynamicUse(DynamicUse dynamicUse) {
565 switch (dynamicUse.kind) { 565 switch (dynamicUse.kind) {
566 case DynamicUseKind.INVOKE: 566 case DynamicUseKind.INVOKE:
567 return _registerNewSelector(dynamicUse, _invokedNames); 567 return _registerNewSelector(dynamicUse, _invokedNames);
568 case DynamicUseKind.GET: 568 case DynamicUseKind.GET:
569 return _registerNewSelector(dynamicUse, _invokedGetters); 569 return _registerNewSelector(dynamicUse, _invokedGetters);
570 case DynamicUseKind.SET: 570 case DynamicUseKind.SET:
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 652
653 void forgetElement(Element element, Compiler compiler) { 653 void forgetElement(Element element, Compiler compiler) {
654 _directlyInstantiatedClasses.remove(element); 654 _directlyInstantiatedClasses.remove(element);
655 if (element is ClassElement) { 655 if (element is ClassElement) {
656 assert(invariant(element, element.thisType.isRaw, 656 assert(invariant(element, element.thisType.isRaw,
657 message: 'Generic classes not supported (${element.thisType}).')); 657 message: 'Generic classes not supported (${element.thisType}).'));
658 _instantiatedTypes..remove(element.rawType)..remove(element.thisType); 658 _instantiatedTypes..remove(element.rawType)..remove(element.thisType);
659 } 659 }
660 } 660 }
661 } 661 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698