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 dart2js.world; | 5 library dart2js.world; |
6 | 6 |
7 import 'closure.dart' show SynthesizedCallMethodElementX; | 7 import 'closure.dart' show SynthesizedCallMethodElementX; |
8 import 'common/backend_api.dart' show Backend; | 8 import 'common/backend_api.dart' show Backend; |
9 import 'common.dart'; | 9 import 'common.dart'; |
10 import 'compiler.dart' show Compiler; | 10 import 'compiler.dart' show Compiler; |
11 import 'core_types.dart' show CoreClasses; | 11 import 'core_types.dart' show CoreClasses; |
12 import 'dart_types.dart'; | 12 import 'dart_types.dart'; |
13 import 'elements/elements.dart' | 13 import 'elements/elements.dart' |
14 show | 14 show |
15 ClassElement, | 15 ClassElement, |
16 Element, | 16 Element, |
17 FunctionElement, | 17 FunctionElement, |
18 MixinApplicationElement, | 18 MixinApplicationElement, |
19 TypedefElement, | 19 TypedefElement, |
20 VariableElement; | 20 VariableElement; |
| 21 import 'js_backend/backend.dart' show JavaScriptBackend; |
21 import 'ordered_typeset.dart'; | 22 import 'ordered_typeset.dart'; |
22 import 'types/masks.dart' show TypeMask, FlatTypeMask; | 23 import 'types/masks.dart' show TypeMask, FlatTypeMask; |
23 import 'universe/class_set.dart'; | 24 import 'universe/class_set.dart'; |
24 import 'universe/function_set.dart' show FunctionSet; | 25 import 'universe/function_set.dart' show FunctionSet; |
25 import 'universe/selector.dart' show Selector; | 26 import 'universe/selector.dart' show Selector; |
26 import 'universe/side_effects.dart' show SideEffects; | 27 import 'universe/side_effects.dart' show SideEffects; |
27 import 'util/util.dart' show Link; | 28 import 'util/util.dart' show Link; |
28 | 29 |
29 /// The [ClassWorld] represents the information known about a program when | 30 /// The [ClassWorld] represents the information known about a program when |
30 /// compiling with closed-world semantics. | 31 /// compiling with closed-world semantics. |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 ClassSet classSet = _classSets[cls.declaration]; | 399 ClassSet classSet = _classSets[cls.declaration]; |
399 if (classSet == null) { | 400 if (classSet == null) { |
400 // Vacuously true. | 401 // Vacuously true. |
401 return true; | 402 return true; |
402 } | 403 } |
403 return classSet.hasOnlyInstantiatedSubclasses; | 404 return classSet.hasOnlyInstantiatedSubclasses; |
404 } | 405 } |
405 | 406 |
406 @override | 407 @override |
407 ClassElement getLubOfInstantiatedSubclasses(ClassElement cls) { | 408 ClassElement getLubOfInstantiatedSubclasses(ClassElement cls) { |
| 409 if (backend.isJsInterop(cls)) { |
| 410 return backend.helpers.jsJavaScriptObjectClass; |
| 411 } |
408 ClassHierarchyNode hierarchy = _classHierarchyNodes[cls.declaration]; | 412 ClassHierarchyNode hierarchy = _classHierarchyNodes[cls.declaration]; |
409 return hierarchy != null | 413 return hierarchy != null |
410 ? hierarchy.getLubOfInstantiatedSubclasses() | 414 ? hierarchy.getLubOfInstantiatedSubclasses() |
411 : null; | 415 : null; |
412 } | 416 } |
413 | 417 |
414 @override | 418 @override |
415 ClassElement getLubOfInstantiatedSubtypes(ClassElement cls) { | 419 ClassElement getLubOfInstantiatedSubtypes(ClassElement cls) { |
| 420 if (backend.isJsInterop(cls)) { |
| 421 return backend.helpers.jsJavaScriptObjectClass; |
| 422 } |
416 ClassSet classSet = _classSets[cls.declaration]; | 423 ClassSet classSet = _classSets[cls.declaration]; |
417 return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null; | 424 return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null; |
418 } | 425 } |
419 | 426 |
420 /// Returns an iterable over the common supertypes of the [classes]. | 427 /// Returns an iterable over the common supertypes of the [classes]. |
421 Iterable<ClassElement> commonSupertypesOf(Iterable<ClassElement> classes) { | 428 Iterable<ClassElement> commonSupertypesOf(Iterable<ClassElement> classes) { |
422 Iterator<ClassElement> iterator = classes.iterator; | 429 Iterator<ClassElement> iterator = classes.iterator; |
423 if (!iterator.moveNext()) return const <ClassElement>[]; | 430 if (!iterator.moveNext()) return const <ClassElement>[]; |
424 | 431 |
425 ClassElement cls = iterator.current; | 432 ClassElement cls = iterator.current; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 | 548 |
542 /// Returns `true` if any subclass of [superclass] implements [type]. | 549 /// Returns `true` if any subclass of [superclass] implements [type]. |
543 bool hasAnySubclassThatImplements( | 550 bool hasAnySubclassThatImplements( |
544 ClassElement superclass, ClassElement type) { | 551 ClassElement superclass, ClassElement type) { |
545 Set<ClassElement> subclasses = typesImplementedBySubclassesOf(superclass); | 552 Set<ClassElement> subclasses = typesImplementedBySubclassesOf(superclass); |
546 if (subclasses == null) return false; | 553 if (subclasses == null) return false; |
547 return subclasses.contains(type); | 554 return subclasses.contains(type); |
548 } | 555 } |
549 | 556 |
550 final Compiler compiler; | 557 final Compiler compiler; |
551 Backend get backend => compiler.backend; | 558 JavaScriptBackend get backend => compiler.backend; |
552 final FunctionSet allFunctions; | 559 final FunctionSet allFunctions; |
553 final Set<Element> functionsCalledInLoop = new Set<Element>(); | 560 final Set<Element> functionsCalledInLoop = new Set<Element>(); |
554 final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>(); | 561 final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>(); |
555 | 562 |
556 final Set<TypedefElement> allTypedefs = new Set<TypedefElement>(); | 563 final Set<TypedefElement> allTypedefs = new Set<TypedefElement>(); |
557 | 564 |
558 final Map<ClassElement, Set<MixinApplicationElement>> _mixinUses = | 565 final Map<ClassElement, Set<MixinApplicationElement>> _mixinUses = |
559 new Map<ClassElement, Set<MixinApplicationElement>>(); | 566 new Map<ClassElement, Set<MixinApplicationElement>>(); |
560 Map<ClassElement, List<MixinApplicationElement>> _liveMixinUses; | 567 Map<ClassElement, List<MixinApplicationElement>> _liveMixinUses; |
561 | 568 |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
873 // function expressions's element. | 880 // function expressions's element. |
874 // TODO(herhut): Generate classes for function expressions earlier. | 881 // TODO(herhut): Generate classes for function expressions earlier. |
875 if (element is SynthesizedCallMethodElementX) { | 882 if (element is SynthesizedCallMethodElementX) { |
876 return getMightBePassedToApply(element.expression); | 883 return getMightBePassedToApply(element.expression); |
877 } | 884 } |
878 return functionsThatMightBePassedToApply.contains(element); | 885 return functionsThatMightBePassedToApply.contains(element); |
879 } | 886 } |
880 | 887 |
881 bool get hasClosedWorldAssumption => !compiler.options.hasIncrementalSupport; | 888 bool get hasClosedWorldAssumption => !compiler.options.hasIncrementalSupport; |
882 } | 889 } |
OLD | NEW |