| 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 'dart:async'; |
| 10 |
| 9 import 'package:async_helper/async_helper.dart'; | 11 import 'package:async_helper/async_helper.dart'; |
| 10 import 'package:compiler/src/closure.dart'; | |
| 11 import 'package:compiler/src/commandline_options.dart'; | 12 import 'package:compiler/src/commandline_options.dart'; |
| 12 import 'package:compiler/src/common.dart'; | 13 import 'package:compiler/src/common.dart'; |
| 13 import 'package:compiler/src/common_elements.dart'; | 14 import 'package:compiler/src/common_elements.dart'; |
| 14 import 'package:compiler/src/common/backend_api.dart'; | 15 import 'package:compiler/src/common/backend_api.dart'; |
| 15 import 'package:compiler/src/common/resolution.dart'; | 16 import 'package:compiler/src/common/tasks.dart'; |
| 16 import 'package:compiler/src/common/work.dart'; | |
| 17 import 'package:compiler/src/compiler.dart'; | 17 import 'package:compiler/src/compiler.dart'; |
| 18 import 'package:compiler/src/deferred_load.dart'; | 18 import 'package:compiler/src/deferred_load.dart'; |
| 19 import 'package:compiler/src/elements/resolution_types.dart'; | 19 import 'package:compiler/src/elements/resolution_types.dart'; |
| 20 import 'package:compiler/src/elements/elements.dart'; | |
| 21 import 'package:compiler/src/elements/entities.dart'; | |
| 22 import 'package:compiler/src/elements/types.dart'; | 20 import 'package:compiler/src/elements/types.dart'; |
| 23 import 'package:compiler/src/enqueue.dart'; | 21 import 'package:compiler/src/enqueue.dart'; |
| 24 import 'package:compiler/src/js_backend/backend.dart' | 22 import 'package:compiler/src/js_backend/backend.dart' |
| 25 hide RuntimeTypesNeedBuilderImpl; | 23 hide RuntimeTypesNeedBuilderImpl; |
| 26 import 'package:compiler/src/js_backend/backend_impact.dart'; | 24 import 'package:compiler/src/js_backend/backend_impact.dart'; |
| 27 import 'package:compiler/src/js_backend/backend_usage.dart'; | 25 import 'package:compiler/src/js_backend/backend_usage.dart'; |
| 28 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; | 26 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; |
| 29 import 'package:compiler/src/js_backend/native_data.dart'; | 27 import 'package:compiler/src/js_backend/native_data.dart'; |
| 30 import 'package:compiler/src/js_backend/impact_transformer.dart'; | 28 import 'package:compiler/src/js_backend/impact_transformer.dart'; |
| 31 import 'package:compiler/src/js_backend/interceptor_data.dart'; | 29 import 'package:compiler/src/js_backend/interceptor_data.dart'; |
| 32 import 'package:compiler/src/js_backend/lookup_map_analysis.dart'; | 30 import 'package:compiler/src/js_backend/lookup_map_analysis.dart'; |
| 33 import 'package:compiler/src/js_backend/mirrors_analysis.dart' | 31 import 'package:compiler/src/js_backend/mirrors_analysis.dart' |
| 34 hide MirrorsResolutionAnalysisImpl; | 32 hide MirrorsResolutionAnalysisImpl; |
| 35 import 'package:compiler/src/js_backend/mirrors_data.dart'; | 33 import 'package:compiler/src/js_backend/mirrors_data.dart'; |
| 36 import 'package:compiler/src/js_backend/no_such_method_registry.dart'; | 34 import 'package:compiler/src/js_backend/no_such_method_registry.dart'; |
| 37 import 'package:compiler/src/js_backend/resolution_listener.dart'; | 35 import 'package:compiler/src/js_backend/resolution_listener.dart'; |
| 38 import 'package:compiler/src/js_backend/type_variable_handler.dart'; | 36 import 'package:compiler/src/js_backend/type_variable_handler.dart'; |
| 39 import 'package:compiler/src/native/enqueue.dart'; | 37 import 'package:compiler/src/native/enqueue.dart'; |
| 40 import 'package:compiler/src/native/resolver.dart'; | 38 import 'package:compiler/src/native/resolver.dart'; |
| 41 import 'package:compiler/src/kernel/element_map.dart'; | 39 import 'package:compiler/src/kernel/element_map.dart'; |
| 42 import 'package:compiler/src/kernel/kernel_strategy.dart'; | 40 import 'package:compiler/src/kernel/kernel_strategy.dart'; |
| 41 import 'package:compiler/src/library_loader.dart'; |
| 43 import 'package:compiler/src/options.dart'; | 42 import 'package:compiler/src/options.dart'; |
| 44 import 'package:compiler/src/universe/world_builder.dart'; | 43 import 'package:compiler/src/universe/world_builder.dart'; |
| 45 import 'package:compiler/src/universe/world_impact.dart'; | |
| 46 import 'package:compiler/src/world.dart'; | 44 import 'package:compiler/src/world.dart'; |
| 47 import 'package:expect/expect.dart'; | 45 import 'package:expect/expect.dart'; |
| 46 import 'package:kernel/ast.dart' as ir; |
| 48 import '../memory_compiler.dart'; | 47 import '../memory_compiler.dart'; |
| 49 import '../serialization/helper.dart'; | 48 import '../serialization/helper.dart'; |
| 50 import '../serialization/model_test_helper.dart'; | 49 import '../serialization/model_test_helper.dart'; |
| 51 import '../serialization/test_helper.dart'; | 50 import '../serialization/test_helper.dart'; |
| 52 | 51 |
| 53 import 'closed_world_test.dart' hide KernelWorkItemBuilder; | 52 import 'closed_world_test.dart' hide KernelWorkItemBuilder; |
| 54 import 'impact_test.dart'; | 53 import 'impact_test.dart'; |
| 55 | 54 |
| 56 const SOURCE = const { | 55 const SOURCE = const { |
| 57 'main.dart': ''' | 56 'main.dart': ''' |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 memorySourceFiles: memorySourceFiles, | 98 memorySourceFiles: memorySourceFiles, |
| 100 options: [ | 99 options: [ |
| 101 Flags.analyzeAll, | 100 Flags.analyzeAll, |
| 102 Flags.useKernel, | 101 Flags.useKernel, |
| 103 Flags.enableAssertMessage | 102 Flags.enableAssertMessage |
| 104 ]); | 103 ]); |
| 105 await compiler.run(entryPoint); | 104 await compiler.run(entryPoint); |
| 106 compiler.resolutionWorldBuilder.closeWorld(); | 105 compiler.resolutionWorldBuilder.closeWorld(); |
| 107 | 106 |
| 108 print('---- closed world from kernel ------------------------------------'); | 107 print('---- closed world from kernel ------------------------------------'); |
| 109 KernelToElementMap elementMap = new KernelToElementMap(compiler.reporter); | 108 Compiler compiler2 = compilerFor( |
| 110 elementMap.addProgram(compiler.backend.kernelTask.program); | 109 entryPoint: entryPoint, |
| 110 memorySourceFiles: memorySourceFiles, |
| 111 options: [ |
| 112 Flags.analyzeOnly, |
| 113 Flags.enableAssertMessage, |
| 114 Flags.loadFromDill |
| 115 ]); |
| 116 ElementResolutionWorldBuilder.useInstantiationMap = true; |
| 117 compiler2.resolution.retainCachesForTesting = true; |
| 118 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy; |
| 119 KernelToElementMap elementMap = frontEndStrategy.elementMap; |
| 120 compiler2.libraryLoader = new MemoryDillLibraryLoaderTask( |
| 121 elementMap, |
| 122 compiler2.reporter, |
| 123 compiler2.measurer, |
| 124 compiler.backend.kernelTask.program); |
| 125 await compiler2.run(entryPoint); |
| 126 Expect.isFalse(compiler2.compilationFailed); |
| 127 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution; |
| 128 BackendUsage backendUsage2 = compiler2.backend.backendUsage; |
| 129 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld(); |
| 111 KernelEquivalence equivalence = new KernelEquivalence(elementMap); | 130 KernelEquivalence equivalence = new KernelEquivalence(elementMap); |
| 112 NativeBasicData nativeBasicData = computeNativeBasicData(elementMap); | |
| 113 checkNativeBasicData( | |
| 114 compiler1.backend.nativeBasicData, nativeBasicData, equivalence); | |
| 115 List list = createKernelResolutionEnqueuerListener( | |
| 116 compiler.options, | |
| 117 compiler.reporter, | |
| 118 compiler.deferredLoadTask, | |
| 119 elementMap, | |
| 120 nativeBasicData); | |
| 121 ResolutionEnqueuerListener resolutionEnqueuerListener = list[0]; | |
| 122 BackendUsageBuilder backendUsageBuilder2 = list[1]; | |
| 123 ImpactTransformer impactTransformer = list[2]; | |
| 124 | |
| 125 ResolutionEnqueuer enqueuer2 = new ResolutionEnqueuer( | |
| 126 compiler.enqueuer, | |
| 127 compiler.options, | |
| 128 compiler.reporter, | |
| 129 const TreeShakingEnqueuerStrategy(), | |
| 130 resolutionEnqueuerListener, | |
| 131 new KernelResolutionWorldBuilder( | |
| 132 elementMap, nativeBasicData, const OpenWorldStrategy()), | |
| 133 new KernelWorkItemBuilder(elementMap, impactTransformer), | |
| 134 'enqueuer from kelements'); | |
| 135 ClosedWorld closedWorld2 = computeClosedWorld( | |
| 136 compiler.reporter, enqueuer2, elementMap.elementEnvironment); | |
| 137 BackendUsage backendUsage2 = backendUsageBuilder2.close(); | |
| 138 checkBackendUsage(backendUsage1, backendUsage2, equivalence); | 131 checkBackendUsage(backendUsage1, backendUsage2, equivalence); |
| 139 | 132 |
| 140 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, | 133 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, |
| 141 elementEquivalence: equivalence.entityEquivalence, | 134 elementEquivalence: equivalence.entityEquivalence, |
| 142 typeEquivalence: (ResolutionDartType a, DartType b) { | 135 typeEquivalence: (ResolutionDartType a, DartType b) { |
| 143 return equivalence.typeEquivalence(unalias(a), b); | 136 return equivalence.typeEquivalence(unalias(a), b); |
| 144 }, elementFilter: elementFilter, verbose: arguments.verbose); | 137 }, elementFilter: elementFilter, verbose: arguments.verbose); |
| 145 | 138 |
| 146 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence, | 139 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence, |
| 147 verbose: arguments.verbose); | 140 verbose: arguments.verbose); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 impacts, | 200 impacts, |
| 208 nativeBasicData, | 201 nativeBasicData, |
| 209 nativeResolutionEnqueuer, | 202 nativeResolutionEnqueuer, |
| 210 backendUsageBuilder, | 203 backendUsageBuilder, |
| 211 mirrorsDataBuilder, | 204 mirrorsDataBuilder, |
| 212 customElementsResolutionAnalysis, | 205 customElementsResolutionAnalysis, |
| 213 rtiNeedBuilder); | 206 rtiNeedBuilder); |
| 214 return [listener, backendUsageBuilder, transformer]; | 207 return [listener, backendUsageBuilder, transformer]; |
| 215 } | 208 } |
| 216 | 209 |
| 217 /// Computes that NativeBasicData for the libraries in [worldBuilder]. | |
| 218 /// TODO(johnniwinther): Use [KernelAnnotationProcessor] instead. | |
| 219 NativeBasicData computeNativeBasicData(KernelToElementMap elementMap) { | |
| 220 NativeBasicDataBuilderImpl builder = new NativeBasicDataBuilderImpl(); | |
| 221 ElementEnvironment elementEnvironment = elementMap.elementEnvironment; | |
| 222 for (LibraryEntity library in elementEnvironment.libraries) { | |
| 223 if (library.canonicalUri.scheme == 'dart') { | |
| 224 new KernelAnnotationProcessor(elementMap) | |
| 225 .extractNativeAnnotations(library, builder); | |
| 226 } | |
| 227 } | |
| 228 return builder.close(elementEnvironment); | |
| 229 } | |
| 230 | |
| 231 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2, | 210 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2, |
| 232 KernelEquivalence equivalence) { | 211 KernelEquivalence equivalence) { |
| 233 checkMapEquivalence( | 212 checkMapEquivalence( |
| 234 data1, | 213 data1, |
| 235 data2, | 214 data2, |
| 236 'nativeClassTagInfo', | 215 'nativeClassTagInfo', |
| 237 data1.nativeClassTagInfo, | 216 data1.nativeClassTagInfo, |
| 238 data2.nativeClassTagInfo, | 217 data2.nativeClassTagInfo, |
| 239 equivalence.entityEquivalence, | 218 equivalence.entityEquivalence, |
| 240 (a, b) => a == b); | 219 (a, b) => a == b); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 usage2.isInvokeOnUsed); | 268 usage2.isInvokeOnUsed); |
| 290 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, | 269 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, |
| 291 usage2.isRuntimeTypeUsed); | 270 usage2.isRuntimeTypeUsed); |
| 292 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, | 271 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, |
| 293 usage2.isIsolateInUse); | 272 usage2.isIsolateInUse); |
| 294 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, | 273 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, |
| 295 usage2.isFunctionApplyUsed); | 274 usage2.isFunctionApplyUsed); |
| 296 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, | 275 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, |
| 297 usage2.isNoSuchMethodUsed); | 276 usage2.isNoSuchMethodUsed); |
| 298 } | 277 } |
| 278 |
| 279 class MemoryDillLibraryLoaderTask extends DillLibraryLoaderTask { |
| 280 final ir.Program program; |
| 281 |
| 282 MemoryDillLibraryLoaderTask(KernelToElementMap elementMap, |
| 283 DiagnosticReporter reporter, Measurer measurer, this.program) |
| 284 : super(elementMap, null, null, reporter, measurer); |
| 285 |
| 286 Future<LoadedLibraries> loadLibrary(Uri resolvedUri, |
| 287 {bool skipFileWithPartOfTag: false}) async { |
| 288 return createLoadedLibraries(program); |
| 289 } |
| 290 } |
| OLD | NEW |