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 ClosureClassElement; | 7 import 'closure.dart' show ClosureClassElement; |
8 import 'common.dart'; | 8 import 'common.dart'; |
9 import 'constants/constant_system.dart'; | 9 import 'constants/constant_system.dart'; |
10 import 'common_elements.dart' show CommonElements, ElementEnvironment; | 10 import 'common_elements.dart' show CommonElements, ElementEnvironment; |
11 import 'elements/entities.dart'; | 11 import 'elements/entities.dart'; |
12 import 'elements/elements.dart' | 12 import 'elements/elements.dart' |
13 show | 13 show |
14 ClassElement, | 14 ClassElement, |
15 Element, | 15 Element, |
16 MemberElement, | 16 MemberElement, |
17 MethodElement, | 17 MethodElement, |
18 MixinApplicationElement, | 18 MixinApplicationElement, |
19 TypedefElement; | 19 TypedefElement; |
20 import 'elements/resolution_types.dart'; | 20 import 'elements/resolution_types.dart'; |
21 import 'elements/types.dart'; | 21 import 'elements/types.dart'; |
22 import 'js_backend/backend_usage.dart' show BackendUsage; | 22 import 'js_backend/backend_usage.dart' show BackendUsage; |
23 import 'js_backend/interceptor_data.dart' show InterceptorData; | 23 import 'js_backend/interceptor_data.dart' show InterceptorData; |
24 import 'js_backend/native_data.dart' show NativeData; | 24 import 'js_backend/native_data.dart' show NativeData; |
| 25 import 'js_backend/runtime_types.dart' |
| 26 show RuntimeTypesNeed, RuntimeTypesNeedBuilder; |
25 import 'ordered_typeset.dart'; | 27 import 'ordered_typeset.dart'; |
| 28 import 'options.dart'; |
26 import 'types/masks.dart' show CommonMasks, FlatTypeMask, TypeMask; | 29 import 'types/masks.dart' show CommonMasks, FlatTypeMask, TypeMask; |
27 import 'universe/class_set.dart'; | 30 import 'universe/class_set.dart'; |
28 import 'universe/function_set.dart' show FunctionSet; | 31 import 'universe/function_set.dart' show FunctionSet; |
29 import 'universe/selector.dart' show Selector; | 32 import 'universe/selector.dart' show Selector; |
30 import 'universe/side_effects.dart' show SideEffects; | 33 import 'universe/side_effects.dart' show SideEffects; |
| 34 import 'universe/world_builder.dart'; |
31 import 'util/util.dart' show Link; | 35 import 'util/util.dart' show Link; |
32 | 36 |
33 /// Common superinterface for [OpenWorld] and [ClosedWorld]. | 37 /// Common superinterface for [OpenWorld] and [ClosedWorld]. |
34 abstract class World {} | 38 abstract class World {} |
35 | 39 |
36 /// The [ClosedWorld] represents the information known about a program when | 40 /// The [ClosedWorld] represents the information known about a program when |
37 /// compiling with closed-world semantics. | 41 /// compiling with closed-world semantics. |
38 /// | 42 /// |
39 /// Given the entrypoint of an application, we can track what's reachable from | 43 /// Given the entrypoint of an application, we can track what's reachable from |
40 /// it, what functions are called, what classes are allocated, which native | 44 /// it, what functions are called, what classes are allocated, which native |
(...skipping 10 matching lines...) Expand all Loading... |
51 ElementEnvironment get elementEnvironment; | 55 ElementEnvironment get elementEnvironment; |
52 | 56 |
53 DartTypes get dartTypes; | 57 DartTypes get dartTypes; |
54 | 58 |
55 CommonElements get commonElements; | 59 CommonElements get commonElements; |
56 | 60 |
57 CommonMasks get commonMasks; | 61 CommonMasks get commonMasks; |
58 | 62 |
59 ConstantSystem get constantSystem; | 63 ConstantSystem get constantSystem; |
60 | 64 |
| 65 RuntimeTypesNeed get rtiNeed; |
| 66 |
| 67 Iterable<ClassEntity> get liveNativeClasses; |
| 68 |
61 /// Returns `true` if [cls] is either directly or indirectly instantiated. | 69 /// Returns `true` if [cls] is either directly or indirectly instantiated. |
62 bool isInstantiated(ClassEntity cls); | 70 bool isInstantiated(ClassEntity cls); |
63 | 71 |
64 /// Returns `true` if [cls] is directly instantiated. This means that at | 72 /// Returns `true` if [cls] is directly instantiated. This means that at |
65 /// runtime instances of exactly [cls] are assumed to exist. | 73 /// runtime instances of exactly [cls] are assumed to exist. |
66 bool isDirectlyInstantiated(ClassEntity cls); | 74 bool isDirectlyInstantiated(ClassEntity cls); |
67 | 75 |
68 /// Returns `true` if [cls] is abstractly instantiated. This means that at | 76 /// Returns `true` if [cls] is abstractly instantiated. This means that at |
69 /// runtime instances of [cls] or unknown subclasses of [cls] are assumed to | 77 /// runtime instances of [cls] or unknown subclasses of [cls] are assumed to |
70 /// exist. | 78 /// exist. |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 final CommonElements commonElements; | 452 final CommonElements commonElements; |
445 | 453 |
446 // TODO(johnniwinther): Can this be derived from [ClassSet]s? | 454 // TODO(johnniwinther): Can this be derived from [ClassSet]s? |
447 final Set<ClassEntity> _implementedClasses; | 455 final Set<ClassEntity> _implementedClasses; |
448 | 456 |
449 final Iterable<MemberEntity> liveInstanceMembers; | 457 final Iterable<MemberEntity> liveInstanceMembers; |
450 | 458 |
451 /// Members that are written either directly or through a setter selector. | 459 /// Members that are written either directly or through a setter selector. |
452 final Iterable<MemberEntity> assignedInstanceMembers; | 460 final Iterable<MemberEntity> assignedInstanceMembers; |
453 | 461 |
| 462 final Iterable<ClassEntity> liveNativeClasses; |
| 463 |
454 ClosedWorldBase( | 464 ClosedWorldBase( |
455 this.elementEnvironment, | 465 this.elementEnvironment, |
456 this.dartTypes, | 466 this.dartTypes, |
457 this.commonElements, | 467 this.commonElements, |
458 this.constantSystem, | 468 this.constantSystem, |
459 this.nativeData, | 469 this.nativeData, |
460 this.interceptorData, | 470 this.interceptorData, |
461 this.backendUsage, | 471 this.backendUsage, |
462 Set<ClassEntity> implementedClasses, | 472 Set<ClassEntity> implementedClasses, |
| 473 this.liveNativeClasses, |
463 this.liveInstanceMembers, | 474 this.liveInstanceMembers, |
464 this.assignedInstanceMembers, | 475 this.assignedInstanceMembers, |
465 Set<TypedefElement> allTypedefs, | 476 Set<TypedefElement> allTypedefs, |
466 this.mixinUses, | 477 this.mixinUses, |
467 this.typesImplementedBySubclasses, | 478 this.typesImplementedBySubclasses, |
468 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | 479 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, |
469 Map<ClassEntity, ClassSet> classSets) | 480 Map<ClassEntity, ClassSet> classSets) |
470 : this._implementedClasses = implementedClasses, | 481 : this._implementedClasses = implementedClasses, |
471 this._allTypedefs = allTypedefs, | 482 this._allTypedefs = allTypedefs, |
472 this._classHierarchyNodes = classHierarchyNodes, | 483 this._classHierarchyNodes = classHierarchyNodes, |
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1160 sb.write("Classes in the closed world related to $cls:\n"); | 1171 sb.write("Classes in the closed world related to $cls:\n"); |
1161 } else { | 1172 } else { |
1162 sb.write("Instantiated classes in the closed world:\n"); | 1173 sb.write("Instantiated classes in the closed world:\n"); |
1163 } | 1174 } |
1164 getClassHierarchyNode(commonElements.objectClass) | 1175 getClassHierarchyNode(commonElements.objectClass) |
1165 .printOn(sb, ' ', instantiatedOnly: cls == null, withRespectTo: cls); | 1176 .printOn(sb, ' ', instantiatedOnly: cls == null, withRespectTo: cls); |
1166 return sb.toString(); | 1177 return sb.toString(); |
1167 } | 1178 } |
1168 } | 1179 } |
1169 | 1180 |
1170 class ClosedWorldImpl extends ClosedWorldBase { | 1181 class ClosedWorldImpl extends ClosedWorldBase with ClosedWorldRtiNeedMixin { |
1171 ClosedWorldImpl( | 1182 ClosedWorldImpl( |
1172 {ElementEnvironment elementEnvironment, | 1183 {CompilerOptions options, |
| 1184 ElementEnvironment elementEnvironment, |
1173 DartTypes dartTypes, | 1185 DartTypes dartTypes, |
1174 CommonElements commonElements, | 1186 CommonElements commonElements, |
1175 ConstantSystem constantSystem, | 1187 ConstantSystem constantSystem, |
1176 NativeData nativeData, | 1188 NativeData nativeData, |
1177 InterceptorData interceptorData, | 1189 InterceptorData interceptorData, |
1178 BackendUsage backendUsage, | 1190 BackendUsage backendUsage, |
| 1191 ResolutionWorldBuilder resolutionWorldBuilder, |
| 1192 RuntimeTypesNeedBuilder rtiNeedBuilder, |
1179 Set<ClassEntity> implementedClasses, | 1193 Set<ClassEntity> implementedClasses, |
| 1194 Iterable<ClassEntity> liveNativeClasses, |
1180 Iterable<MemberEntity> liveInstanceMembers, | 1195 Iterable<MemberEntity> liveInstanceMembers, |
1181 Iterable<MemberEntity> assignedInstanceMembers, | 1196 Iterable<MemberEntity> assignedInstanceMembers, |
1182 Set<TypedefElement> allTypedefs, | 1197 Set<TypedefElement> allTypedefs, |
1183 Map<ClassEntity, Set<ClassEntity>> mixinUses, | 1198 Map<ClassEntity, Set<ClassEntity>> mixinUses, |
1184 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, | 1199 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, |
1185 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | 1200 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, |
1186 Map<ClassEntity, ClassSet> classSets}) | 1201 Map<ClassEntity, ClassSet> classSets}) |
1187 : super( | 1202 : super( |
1188 elementEnvironment, | 1203 elementEnvironment, |
1189 dartTypes, | 1204 dartTypes, |
1190 commonElements, | 1205 commonElements, |
1191 constantSystem, | 1206 constantSystem, |
1192 nativeData, | 1207 nativeData, |
1193 interceptorData, | 1208 interceptorData, |
1194 backendUsage, | 1209 backendUsage, |
1195 implementedClasses, | 1210 implementedClasses, |
| 1211 liveNativeClasses, |
1196 liveInstanceMembers, | 1212 liveInstanceMembers, |
1197 assignedInstanceMembers, | 1213 assignedInstanceMembers, |
1198 allTypedefs, | 1214 allTypedefs, |
1199 mixinUses, | 1215 mixinUses, |
1200 typesImplementedBySubclasses, | 1216 typesImplementedBySubclasses, |
1201 classHierarchyNodes, | 1217 classHierarchyNodes, |
1202 classSets); | 1218 classSets) { |
| 1219 computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, |
| 1220 enableTypeAssertions: options.enableTypeAssertions); |
| 1221 } |
1203 | 1222 |
1204 bool checkClass(ClassElement cls) => cls.isDeclaration; | 1223 bool checkClass(ClassElement cls) => cls.isDeclaration; |
1205 | 1224 |
1206 bool checkEntity(Element element) => element.isDeclaration; | 1225 bool checkEntity(Element element) => element.isDeclaration; |
1207 | 1226 |
1208 bool checkInvariants(ClassElement cls, {bool mustBeInstantiated: true}) { | 1227 bool checkInvariants(ClassElement cls, {bool mustBeInstantiated: true}) { |
1209 assert(cls.isDeclaration, failedAt(cls, '$cls must be the declaration.')); | 1228 assert(cls.isDeclaration, failedAt(cls, '$cls must be the declaration.')); |
1210 assert(cls.isResolved, failedAt(cls, '$cls must be resolved.')); | 1229 assert(cls.isResolved, failedAt(cls, '$cls must be resolved.')); |
1211 | 1230 |
1212 // TODO(johnniwinther): Reinsert this or similar invariant. Currently | 1231 // TODO(johnniwinther): Reinsert this or similar invariant. Currently |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1308 // does not see generative constructor bodies because they are | 1327 // does not see generative constructor bodies because they are |
1309 // created by the backend. Also, it does not make any distinction | 1328 // created by the backend. Also, it does not make any distinction |
1310 // between a constructor and its body for side effects. This | 1329 // between a constructor and its body for side effects. This |
1311 // implies that currently, the side effects of a constructor body | 1330 // implies that currently, the side effects of a constructor body |
1312 // contain the side effects of the initializers. | 1331 // contain the side effects of the initializers. |
1313 assert(!element.isGenerativeConstructorBody); | 1332 assert(!element.isGenerativeConstructorBody); |
1314 assert(!element.isField); | 1333 assert(!element.isField); |
1315 return super.getSideEffectsOfElement(element); | 1334 return super.getSideEffectsOfElement(element); |
1316 } | 1335 } |
1317 } | 1336 } |
| 1337 |
| 1338 abstract class ClosedWorldRtiNeedMixin implements ClosedWorld { |
| 1339 RuntimeTypesNeed _rtiNeed; |
| 1340 |
| 1341 void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder, |
| 1342 RuntimeTypesNeedBuilder rtiNeedBuilder, |
| 1343 {bool enableTypeAssertions}) { |
| 1344 _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed( |
| 1345 resolutionWorldBuilder, this, |
| 1346 enableTypeAssertions: enableTypeAssertions); |
| 1347 } |
| 1348 |
| 1349 RuntimeTypesNeed get rtiNeed => _rtiNeed; |
| 1350 } |
OLD | NEW |