| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 // Partial test that the closed world computed from [WorldImpact]s derived from | 5 // Partial test that the closed world computed from [WorldImpact]s derived from |
| 6 // kernel is equivalent to the original computed from resolution. | 6 // kernel is equivalent to the original computed from resolution. |
| 7 library dart2js.kernel.closed_world2_test; | 7 library dart2js.kernel.closed_world2_test; |
| 8 | 8 |
| 9 import 'package:async_helper/async_helper.dart'; | 9 import 'package:async_helper/async_helper.dart'; |
| 10 import 'package:compiler/src/closure.dart'; | 10 import 'package:compiler/src/closure.dart'; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 import 'package:compiler/src/js_backend/native_data.dart'; | 28 import 'package:compiler/src/js_backend/native_data.dart'; |
| 29 import 'package:compiler/src/js_backend/impact_transformer.dart'; | 29 import 'package:compiler/src/js_backend/impact_transformer.dart'; |
| 30 import 'package:compiler/src/js_backend/interceptor_data.dart'; | 30 import 'package:compiler/src/js_backend/interceptor_data.dart'; |
| 31 import 'package:compiler/src/js_backend/lookup_map_analysis.dart'; | 31 import 'package:compiler/src/js_backend/lookup_map_analysis.dart'; |
| 32 import 'package:compiler/src/js_backend/mirrors_analysis.dart'; | 32 import 'package:compiler/src/js_backend/mirrors_analysis.dart'; |
| 33 import 'package:compiler/src/js_backend/mirrors_data.dart'; | 33 import 'package:compiler/src/js_backend/mirrors_data.dart'; |
| 34 import 'package:compiler/src/js_backend/no_such_method_registry.dart'; | 34 import 'package:compiler/src/js_backend/no_such_method_registry.dart'; |
| 35 import 'package:compiler/src/js_backend/resolution_listener.dart'; | 35 import 'package:compiler/src/js_backend/resolution_listener.dart'; |
| 36 import 'package:compiler/src/js_backend/type_variable_handler.dart'; | 36 import 'package:compiler/src/js_backend/type_variable_handler.dart'; |
| 37 import 'package:compiler/src/native/enqueue.dart'; | 37 import 'package:compiler/src/native/enqueue.dart'; |
| 38 import 'package:compiler/src/kernel/world_builder.dart'; | 38 import 'package:compiler/src/kernel/element_map.dart'; |
| 39 import 'package:compiler/src/options.dart'; | 39 import 'package:compiler/src/options.dart'; |
| 40 import 'package:compiler/src/universe/world_builder.dart'; | 40 import 'package:compiler/src/universe/world_builder.dart'; |
| 41 import 'package:compiler/src/universe/world_impact.dart'; | 41 import 'package:compiler/src/universe/world_impact.dart'; |
| 42 import 'package:compiler/src/world.dart'; | 42 import 'package:compiler/src/world.dart'; |
| 43 import '../memory_compiler.dart'; | 43 import '../memory_compiler.dart'; |
| 44 import '../serialization/helper.dart'; | 44 import '../serialization/helper.dart'; |
| 45 import '../serialization/model_test_helper.dart'; | 45 import '../serialization/model_test_helper.dart'; |
| 46 import '../serialization/test_helper.dart'; | 46 import '../serialization/test_helper.dart'; |
| 47 | 47 |
| 48 import 'closed_world_test.dart'; | 48 import 'closed_world_test.dart'; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 memorySourceFiles: memorySourceFiles, | 89 memorySourceFiles: memorySourceFiles, |
| 90 options: [ | 90 options: [ |
| 91 Flags.analyzeAll, | 91 Flags.analyzeAll, |
| 92 Flags.useKernel, | 92 Flags.useKernel, |
| 93 Flags.enableAssertMessage | 93 Flags.enableAssertMessage |
| 94 ]); | 94 ]); |
| 95 await compiler.run(entryPoint); | 95 await compiler.run(entryPoint); |
| 96 compiler.resolutionWorldBuilder.closeWorld(); | 96 compiler.resolutionWorldBuilder.closeWorld(); |
| 97 | 97 |
| 98 print('---- closed world from kernel ------------------------------------'); | 98 print('---- closed world from kernel ------------------------------------'); |
| 99 KernelWorldBuilder worldBuilder = new KernelWorldBuilder( | 99 KernelToElementMap elementMap = new KernelToElementMap( |
| 100 compiler.reporter, compiler.backend.kernelTask.program); | 100 compiler.reporter, compiler.backend.kernelTask.program); |
| 101 KernelEquivalence equivalence = new KernelEquivalence(worldBuilder); | 101 KernelEquivalence equivalence = new KernelEquivalence(elementMap); |
| 102 NativeBasicData nativeBasicData = computeNativeBasicData(worldBuilder); | 102 NativeBasicData nativeBasicData = computeNativeBasicData(elementMap); |
| 103 checkNativeBasicData( | 103 checkNativeBasicData( |
| 104 compiler.backend.nativeBasicData, nativeBasicData, equivalence); | 104 compiler.backend.nativeBasicData, nativeBasicData, equivalence); |
| 105 List list = createKernelResolutionEnqueuerListener( | 105 List list = createKernelResolutionEnqueuerListener( |
| 106 compiler.options, | 106 compiler.options, |
| 107 compiler.reporter, | 107 compiler.reporter, |
| 108 compiler.deferredLoadTask, | 108 compiler.deferredLoadTask, |
| 109 worldBuilder, | 109 elementMap, |
| 110 nativeBasicData); | 110 nativeBasicData); |
| 111 ResolutionEnqueuerListener resolutionEnqueuerListener = list[0]; | 111 ResolutionEnqueuerListener resolutionEnqueuerListener = list[0]; |
| 112 BackendUsageBuilder backendUsageBuilder2 = list[1]; | 112 BackendUsageBuilder backendUsageBuilder2 = list[1]; |
| 113 ImpactTransformer impactTransformer = list[2]; | 113 ImpactTransformer impactTransformer = list[2]; |
| 114 ResolutionEnqueuer enqueuer2 = new ResolutionEnqueuer( | 114 ResolutionEnqueuer enqueuer2 = new ResolutionEnqueuer( |
| 115 compiler.enqueuer, | 115 compiler.enqueuer, |
| 116 compiler.options, | 116 compiler.options, |
| 117 compiler.reporter, | 117 compiler.reporter, |
| 118 const TreeShakingEnqueuerStrategy(), | 118 const TreeShakingEnqueuerStrategy(), |
| 119 resolutionEnqueuerListener, | 119 resolutionEnqueuerListener, |
| 120 new KernelResolutionWorldBuilder( | 120 new KernelResolutionWorldBuilder( |
| 121 worldBuilder, nativeBasicData, const OpenWorldStrategy()), | 121 elementMap, nativeBasicData, const OpenWorldStrategy()), |
| 122 new KernelWorkItemBuilder(worldBuilder, impactTransformer), | 122 new KernelWorkItemBuilder(elementMap, impactTransformer), |
| 123 'enqueuer from kelements'); | 123 'enqueuer from kelements'); |
| 124 ClosedWorld closedWorld2 = computeClosedWorld( | 124 ClosedWorld closedWorld2 = computeClosedWorld( |
| 125 compiler.reporter, enqueuer2, worldBuilder.elementEnvironment); | 125 compiler.reporter, enqueuer2, elementMap.elementEnvironment); |
| 126 BackendUsage backendUsage2 = backendUsageBuilder2.close(); | 126 BackendUsage backendUsage2 = backendUsageBuilder2.close(); |
| 127 checkBackendUsage(backendUsage1, backendUsage2, equivalence); | 127 checkBackendUsage(backendUsage1, backendUsage2, equivalence); |
| 128 | 128 |
| 129 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, | 129 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, |
| 130 elementEquivalence: equivalence.entityEquivalence, | 130 elementEquivalence: equivalence.entityEquivalence, |
| 131 typeEquivalence: (ResolutionDartType a, DartType b) { | 131 typeEquivalence: (ResolutionDartType a, DartType b) { |
| 132 return equivalence.typeEquivalence(unalias(a), b); | 132 return equivalence.typeEquivalence(unalias(a), b); |
| 133 }, elementFilter: elementFilter, verbose: arguments.verbose); | 133 }, elementFilter: elementFilter, verbose: arguments.verbose); |
| 134 | 134 |
| 135 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence, | 135 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence, |
| 136 verbose: arguments.verbose); | 136 verbose: arguments.verbose); |
| 137 }); | 137 }); |
| 138 } | 138 } |
| 139 | 139 |
| 140 List createKernelResolutionEnqueuerListener( | 140 List createKernelResolutionEnqueuerListener( |
| 141 CompilerOptions options, | 141 CompilerOptions options, |
| 142 DiagnosticReporter reporter, | 142 DiagnosticReporter reporter, |
| 143 DeferredLoadTask deferredLoadTask, | 143 DeferredLoadTask deferredLoadTask, |
| 144 KernelWorldBuilder worldBuilder, | 144 KernelToElementMap elementMap, |
| 145 NativeBasicData nativeBasicData) { | 145 NativeBasicData nativeBasicData) { |
| 146 ElementEnvironment elementEnvironment = worldBuilder.elementEnvironment; | 146 ElementEnvironment elementEnvironment = elementMap.elementEnvironment; |
| 147 CommonElements commonElements = worldBuilder.commonElements; | 147 CommonElements commonElements = elementMap.commonElements; |
| 148 BackendImpacts impacts = new BackendImpacts(options, commonElements); | 148 BackendImpacts impacts = new BackendImpacts(options, commonElements); |
| 149 | 149 |
| 150 // TODO(johnniwinther): Create Kernel based implementations for these: | 150 // TODO(johnniwinther): Create Kernel based implementations for these: |
| 151 RuntimeTypesNeedBuilder rtiNeedBuilder = new RuntimeTypesNeedBuilderImpl(); | 151 RuntimeTypesNeedBuilder rtiNeedBuilder = new RuntimeTypesNeedBuilderImpl(); |
| 152 MirrorsDataBuilder mirrorsDataBuilder = new MirrorsDataBuilderImpl(); | 152 MirrorsDataBuilder mirrorsDataBuilder = new MirrorsDataBuilderImpl(); |
| 153 CustomElementsResolutionAnalysis customElementsResolutionAnalysis = | 153 CustomElementsResolutionAnalysis customElementsResolutionAnalysis = |
| 154 new CustomElementsResolutionAnalysisImpl(); | 154 new CustomElementsResolutionAnalysisImpl(); |
| 155 MirrorsResolutionAnalysis mirrorsResolutionAnalysis = | 155 MirrorsResolutionAnalysis mirrorsResolutionAnalysis = |
| 156 new MirrorsResolutionAnalysisImpl(); | 156 new MirrorsResolutionAnalysisImpl(); |
| 157 LookupMapResolutionAnalysis lookupMapResolutionAnalysis = | 157 LookupMapResolutionAnalysis lookupMapResolutionAnalysis = |
| 158 new LookupMapResolutionAnalysis(reporter, elementEnvironment); | 158 new LookupMapResolutionAnalysis(reporter, elementEnvironment); |
| 159 | 159 |
| 160 InterceptorDataBuilder interceptorDataBuilder = | 160 InterceptorDataBuilder interceptorDataBuilder = |
| 161 new InterceptorDataBuilderImpl( | 161 new InterceptorDataBuilderImpl( |
| 162 nativeBasicData, elementEnvironment, commonElements); | 162 nativeBasicData, elementEnvironment, commonElements); |
| 163 BackendUsageBuilder backendUsageBuilder = | 163 BackendUsageBuilder backendUsageBuilder = |
| 164 new BackendUsageBuilderImpl(commonElements); | 164 new BackendUsageBuilderImpl(commonElements); |
| 165 NoSuchMethodRegistry noSuchMethodRegistry = new NoSuchMethodRegistry( | 165 NoSuchMethodRegistry noSuchMethodRegistry = new NoSuchMethodRegistry( |
| 166 commonElements, new KernelNoSuchMethodResolver(worldBuilder)); | 166 commonElements, new KernelNoSuchMethodResolver(elementMap)); |
| 167 NativeResolutionEnqueuer nativeResolutionEnqueuer = | 167 NativeResolutionEnqueuer nativeResolutionEnqueuer = |
| 168 new NativeResolutionEnqueuer(options, elementEnvironment, commonElements, | 168 new NativeResolutionEnqueuer(options, elementEnvironment, commonElements, |
| 169 backendUsageBuilder, new KernelNativeClassResolver(worldBuilder)); | 169 backendUsageBuilder, new KernelNativeClassResolver(elementMap)); |
| 170 | 170 |
| 171 ResolutionEnqueuerListener listener = new ResolutionEnqueuerListener( | 171 ResolutionEnqueuerListener listener = new ResolutionEnqueuerListener( |
| 172 options, | 172 options, |
| 173 elementEnvironment, | 173 elementEnvironment, |
| 174 commonElements, | 174 commonElements, |
| 175 impacts, | 175 impacts, |
| 176 nativeBasicData, | 176 nativeBasicData, |
| 177 interceptorDataBuilder, | 177 interceptorDataBuilder, |
| 178 backendUsageBuilder, | 178 backendUsageBuilder, |
| 179 rtiNeedBuilder, | 179 rtiNeedBuilder, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 196 nativeResolutionEnqueuer, | 196 nativeResolutionEnqueuer, |
| 197 backendUsageBuilder, | 197 backendUsageBuilder, |
| 198 mirrorsDataBuilder, | 198 mirrorsDataBuilder, |
| 199 customElementsResolutionAnalysis, | 199 customElementsResolutionAnalysis, |
| 200 rtiNeedBuilder); | 200 rtiNeedBuilder); |
| 201 return [listener, backendUsageBuilder, transformer]; | 201 return [listener, backendUsageBuilder, transformer]; |
| 202 } | 202 } |
| 203 | 203 |
| 204 /// Computes that NativeBasicData for the libraries in [worldBuilder]. | 204 /// Computes that NativeBasicData for the libraries in [worldBuilder]. |
| 205 /// TODO(johnniwinther): Use [KernelAnnotationProcessor] instead. | 205 /// TODO(johnniwinther): Use [KernelAnnotationProcessor] instead. |
| 206 NativeBasicData computeNativeBasicData(KernelWorldBuilder worldBuilder) { | 206 NativeBasicData computeNativeBasicData(KernelToElementMap elementMap) { |
| 207 NativeBasicDataBuilderImpl builder = new NativeBasicDataBuilderImpl(); | 207 NativeBasicDataBuilderImpl builder = new NativeBasicDataBuilderImpl(); |
| 208 ElementEnvironment elementEnvironment = worldBuilder.elementEnvironment; | 208 ElementEnvironment elementEnvironment = elementMap.elementEnvironment; |
| 209 for (LibraryEntity library in elementEnvironment.libraries) { | 209 for (LibraryEntity library in elementEnvironment.libraries) { |
| 210 if (library.canonicalUri.scheme == 'dart') { | 210 if (library.canonicalUri.scheme == 'dart') { |
| 211 new KernelAnnotationProcessor(worldBuilder) | 211 new KernelAnnotationProcessor(elementMap) |
| 212 .extractNativeAnnotations(library, builder); | 212 .extractNativeAnnotations(library, builder); |
| 213 } | 213 } |
| 214 } | 214 } |
| 215 return builder.close(elementEnvironment); | 215 return builder.close(elementEnvironment); |
| 216 } | 216 } |
| 217 | 217 |
| 218 class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder { | 218 class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder { |
| 219 @override | 219 @override |
| 220 void registerClassUsingTypeVariableExpression(ClassEntity cls) {} | 220 void registerClassUsingTypeVariableExpression(ClassEntity cls) {} |
| 221 | 221 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 @override | 287 @override |
| 288 MirrorsCodegenAnalysis close() { | 288 MirrorsCodegenAnalysis close() { |
| 289 throw new UnimplementedError('MirrorsResolutionAnalysisImpl.close'); | 289 throw new UnimplementedError('MirrorsResolutionAnalysisImpl.close'); |
| 290 } | 290 } |
| 291 | 291 |
| 292 @override | 292 @override |
| 293 void onResolutionComplete() {} | 293 void onResolutionComplete() {} |
| 294 } | 294 } |
| 295 | 295 |
| 296 class KernelWorkItemBuilder implements WorkItemBuilder { | 296 class KernelWorkItemBuilder implements WorkItemBuilder { |
| 297 final KernelWorldBuilder _worldBuilder; | 297 final KernelToElementMap _worldBuilder; |
| 298 final ImpactTransformer _impactTransformer; | 298 final ImpactTransformer _impactTransformer; |
| 299 | 299 |
| 300 KernelWorkItemBuilder(this._worldBuilder, this._impactTransformer); | 300 KernelWorkItemBuilder(this._worldBuilder, this._impactTransformer); |
| 301 | 301 |
| 302 @override | 302 @override |
| 303 WorkItem createWorkItem(MemberEntity entity) { | 303 WorkItem createWorkItem(MemberEntity entity) { |
| 304 return new KernelWorkItem(_worldBuilder, _impactTransformer, entity); | 304 return new KernelWorkItem(_worldBuilder, _impactTransformer, entity); |
| 305 } | 305 } |
| 306 } | 306 } |
| 307 | 307 |
| 308 class KernelWorkItem implements ResolutionWorkItem { | 308 class KernelWorkItem implements ResolutionWorkItem { |
| 309 final KernelWorldBuilder _worldBuilder; | 309 final KernelToElementMap _worldBuilder; |
| 310 final ImpactTransformer _impactTransformer; | 310 final ImpactTransformer _impactTransformer; |
| 311 final MemberEntity element; | 311 final MemberEntity element; |
| 312 | 312 |
| 313 KernelWorkItem(this._worldBuilder, this._impactTransformer, this.element); | 313 KernelWorkItem(this._worldBuilder, this._impactTransformer, this.element); |
| 314 | 314 |
| 315 @override | 315 @override |
| 316 WorldImpact run() { | 316 WorldImpact run() { |
| 317 ResolutionImpact impact = _worldBuilder.computeWorldImpact(element); | 317 ResolutionImpact impact = _worldBuilder.computeWorldImpact(element); |
| 318 return _impactTransformer.transformResolutionImpact(impact); | 318 return _impactTransformer.transformResolutionImpact(impact); |
| 319 } | 319 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 usage2.isInvokeOnUsed); | 380 usage2.isInvokeOnUsed); |
| 381 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, | 381 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, |
| 382 usage2.isRuntimeTypeUsed); | 382 usage2.isRuntimeTypeUsed); |
| 383 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, | 383 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, |
| 384 usage2.isIsolateInUse); | 384 usage2.isIsolateInUse); |
| 385 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, | 385 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, |
| 386 usage2.isFunctionApplyUsed); | 386 usage2.isFunctionApplyUsed); |
| 387 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, | 387 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, |
| 388 usage2.isNoSuchMethodUsed); | 388 usage2.isNoSuchMethodUsed); |
| 389 } | 389 } |
| OLD | NEW |