| 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 if (arguments.uri != null) { | 61 if (arguments.uri != null) { |
| 62 entryPoint = arguments.uri; | 62 entryPoint = arguments.uri; |
| 63 memorySourceFiles = const <String, String>{}; | 63 memorySourceFiles = const <String, String>{}; |
| 64 } else { | 64 } else { |
| 65 entryPoint = Uri.parse('memory:main.dart'); | 65 entryPoint = Uri.parse('memory:main.dart'); |
| 66 memorySourceFiles = SOURCE; | 66 memorySourceFiles = SOURCE; |
| 67 } | 67 } |
| 68 | 68 |
| 69 asyncTest(() async { | 69 asyncTest(() async { |
| 70 enableDebugMode(); | 70 enableDebugMode(); |
| 71 |
| 72 print('---- analyze-only ------------------------------------------------'); |
| 73 Compiler compiler1 = compilerFor( |
| 74 entryPoint: entryPoint, |
| 75 memorySourceFiles: memorySourceFiles, |
| 76 options: [Flags.analyzeOnly, Flags.enableAssertMessage]); |
| 77 ElementResolutionWorldBuilder.useInstantiationMap = true; |
| 78 compiler1.resolution.retainCachesForTesting = true; |
| 79 await compiler1.run(entryPoint); |
| 80 ResolutionEnqueuer enqueuer1 = compiler1.enqueuer.resolution; |
| 81 BackendUsage backendUsage1 = compiler1.backend.backendUsage; |
| 82 compiler1.resolutionWorldBuilder.closeWorld(); |
| 83 |
| 84 print('---- analyze-all -------------------------------------------------'); |
| 71 Compiler compiler = compilerFor( | 85 Compiler compiler = compilerFor( |
| 72 entryPoint: entryPoint, | 86 entryPoint: entryPoint, |
| 73 memorySourceFiles: memorySourceFiles, | 87 memorySourceFiles: memorySourceFiles, |
| 74 options: [ | 88 options: [ |
| 75 Flags.analyzeAll, | 89 Flags.analyzeAll, |
| 76 Flags.useKernel, | 90 Flags.useKernel, |
| 77 Flags.enableAssertMessage | 91 Flags.enableAssertMessage |
| 78 ]); | 92 ]); |
| 79 ElementResolutionWorldBuilder.useInstantiationMap = true; | |
| 80 compiler.resolution.retainCachesForTesting = true; | |
| 81 await compiler.run(entryPoint); | 93 await compiler.run(entryPoint); |
| 82 compiler.resolutionWorldBuilder.closeWorld(); | 94 compiler.resolutionWorldBuilder.closeWorld(); |
| 83 | 95 |
| 96 print('---- closed world from kernel ------------------------------------'); |
| 84 KernelWorldBuilder worldBuilder = new KernelWorldBuilder( | 97 KernelWorldBuilder worldBuilder = new KernelWorldBuilder( |
| 85 compiler.reporter, compiler.backend.kernelTask.program); | 98 compiler.reporter, compiler.backend.kernelTask.program); |
| 86 KernelEquivalence equivalence = new KernelEquivalence(worldBuilder); | 99 KernelEquivalence equivalence = new KernelEquivalence(worldBuilder); |
| 87 NativeBasicData nativeBasicData = computeNativeBasicData(worldBuilder); | 100 NativeBasicData nativeBasicData = computeNativeBasicData(worldBuilder); |
| 88 checkNativeBasicData( | 101 checkNativeBasicData( |
| 89 compiler.backend.nativeBasicData, nativeBasicData, equivalence); | 102 compiler.backend.nativeBasicData, nativeBasicData, equivalence); |
| 90 List list = createKernelResolutionEnqueuerListener( | 103 List list = createKernelResolutionEnqueuerListener( |
| 91 compiler.options, | 104 compiler.options, |
| 92 compiler.reporter, | 105 compiler.reporter, |
| 93 compiler.deferredLoadTask, | 106 compiler.deferredLoadTask, |
| 94 worldBuilder, | 107 worldBuilder, |
| 95 nativeBasicData); | 108 nativeBasicData); |
| 96 ResolutionEnqueuerListener resolutionEnqueuerListener = list[0]; | 109 ResolutionEnqueuerListener resolutionEnqueuerListener = list[0]; |
| 97 ImpactTransformer impactTransformer = list[1]; | 110 BackendUsageBuilder backendUsageBuilder2 = list[1]; |
| 98 ResolutionEnqueuer enqueuer = new ResolutionEnqueuer( | 111 ImpactTransformer impactTransformer = list[2]; |
| 112 ResolutionEnqueuer enqueuer2 = new ResolutionEnqueuer( |
| 99 compiler.enqueuer, | 113 compiler.enqueuer, |
| 100 compiler.options, | 114 compiler.options, |
| 101 compiler.reporter, | 115 compiler.reporter, |
| 102 const TreeShakingEnqueuerStrategy(), | 116 const TreeShakingEnqueuerStrategy(), |
| 103 resolutionEnqueuerListener, | 117 resolutionEnqueuerListener, |
| 104 new KernelResolutionWorldBuilder( | 118 new KernelResolutionWorldBuilder( |
| 105 worldBuilder.elementEnvironment, | 119 worldBuilder.elementEnvironment, |
| 106 worldBuilder.commonElements, | 120 worldBuilder.commonElements, |
| 107 nativeBasicData, | 121 nativeBasicData, |
| 108 const OpenWorldStrategy()), | 122 const OpenWorldStrategy()), |
| 109 new KernelWorkItemBuilder(worldBuilder, impactTransformer), | 123 new KernelWorkItemBuilder(worldBuilder, impactTransformer), |
| 110 'enqueuer from kelements'); | 124 'enqueuer from kelements'); |
| 111 | |
| 112 computeClosedWorld( | 125 computeClosedWorld( |
| 113 compiler.reporter, enqueuer, worldBuilder.elementEnvironment); | 126 compiler.reporter, enqueuer2, worldBuilder.elementEnvironment); |
| 127 BackendUsage backendUsage2 = backendUsageBuilder2.close(); |
| 128 checkBackendUsage(backendUsage1, backendUsage2, equivalence); |
| 114 }); | 129 }); |
| 115 } | 130 } |
| 116 | 131 |
| 117 List createKernelResolutionEnqueuerListener( | 132 List createKernelResolutionEnqueuerListener( |
| 118 CompilerOptions options, | 133 CompilerOptions options, |
| 119 DiagnosticReporter reporter, | 134 DiagnosticReporter reporter, |
| 120 DeferredLoadTask deferredLoadTask, | 135 DeferredLoadTask deferredLoadTask, |
| 121 KernelWorldBuilder worldBuilder, | 136 KernelWorldBuilder worldBuilder, |
| 122 NativeBasicData nativeBasicData) { | 137 NativeBasicData nativeBasicData) { |
| 123 ElementEnvironment elementEnvironment = worldBuilder.elementEnvironment; | 138 ElementEnvironment elementEnvironment = worldBuilder.elementEnvironment; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 options, | 183 options, |
| 169 elementEnvironment, | 184 elementEnvironment, |
| 170 commonElements, | 185 commonElements, |
| 171 impacts, | 186 impacts, |
| 172 nativeBasicData, | 187 nativeBasicData, |
| 173 nativeResolutionEnqueuer, | 188 nativeResolutionEnqueuer, |
| 174 backendUsageBuilder, | 189 backendUsageBuilder, |
| 175 mirrorsDataBuilder, | 190 mirrorsDataBuilder, |
| 176 customElementsResolutionAnalysis, | 191 customElementsResolutionAnalysis, |
| 177 rtiNeedBuilder); | 192 rtiNeedBuilder); |
| 178 return [listener, transformer]; | 193 return [listener, backendUsageBuilder, transformer]; |
| 179 } | 194 } |
| 180 | 195 |
| 181 class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder { | 196 class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder { |
| 182 @override | 197 @override |
| 183 void registerClassUsingTypeVariableExpression(ClassEntity cls) {} | 198 void registerClassUsingTypeVariableExpression(ClassEntity cls) {} |
| 184 | 199 |
| 185 @override | 200 @override |
| 186 RuntimeTypesNeed computeRuntimeTypesNeed( | 201 RuntimeTypesNeed computeRuntimeTypesNeed( |
| 187 ResolutionWorldBuilder resolutionWorldBuilder, | 202 ResolutionWorldBuilder resolutionWorldBuilder, |
| 188 ClosedWorld closedWorld, | 203 ClosedWorld closedWorld, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2, | 300 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2, |
| 286 KernelEquivalence equivalence) { | 301 KernelEquivalence equivalence) { |
| 287 checkMapEquivalence( | 302 checkMapEquivalence( |
| 288 data1, | 303 data1, |
| 289 data2, | 304 data2, |
| 290 'nativeClassTagInfo', | 305 'nativeClassTagInfo', |
| 291 data1.nativeClassTagInfo, | 306 data1.nativeClassTagInfo, |
| 292 data2.nativeClassTagInfo, | 307 data2.nativeClassTagInfo, |
| 293 equivalence.entityEquivalence, | 308 equivalence.entityEquivalence, |
| 294 (a, b) => a == b); | 309 (a, b) => a == b); |
| 310 // TODO(johnniwinther): Check the remaining properties. |
| 295 } | 311 } |
| 312 |
| 313 void checkBackendUsage(BackendUsageImpl usage1, BackendUsageImpl usage2, |
| 314 KernelEquivalence equivalence) { |
| 315 checkSetEquivalence( |
| 316 usage1, |
| 317 usage2, |
| 318 'globalClassDependencies', |
| 319 usage1.globalClassDependencies, |
| 320 usage2.globalClassDependencies, |
| 321 equivalence.entityEquivalence); |
| 322 checkSetEquivalence( |
| 323 usage1, |
| 324 usage2, |
| 325 'globalFunctionDependencies', |
| 326 usage1.globalFunctionDependencies, |
| 327 usage2.globalFunctionDependencies, |
| 328 equivalence.entityEquivalence); |
| 329 checkSetEquivalence( |
| 330 usage1, |
| 331 usage2, |
| 332 'helperClassesUsed', |
| 333 usage1.helperClassesUsed, |
| 334 usage2.helperClassesUsed, |
| 335 equivalence.entityEquivalence); |
| 336 checkSetEquivalence( |
| 337 usage1, |
| 338 usage2, |
| 339 'helperFunctionsUsed', |
| 340 usage1.helperFunctionsUsed, |
| 341 usage2.helperFunctionsUsed, |
| 342 equivalence.entityEquivalence); |
| 343 check( |
| 344 usage1, |
| 345 usage2, |
| 346 'needToInitializeIsolateAffinityTag', |
| 347 usage1.needToInitializeIsolateAffinityTag, |
| 348 usage2.needToInitializeIsolateAffinityTag); |
| 349 check( |
| 350 usage1, |
| 351 usage2, |
| 352 'needToInitializeDispatchProperty', |
| 353 usage1.needToInitializeDispatchProperty, |
| 354 usage2.needToInitializeDispatchProperty); |
| 355 check(usage1, usage2, 'requiresPreamble', usage1.requiresPreamble, |
| 356 usage2.requiresPreamble); |
| 357 check(usage1, usage2, 'isInvokeOnUsed', usage1.isInvokeOnUsed, |
| 358 usage2.isInvokeOnUsed); |
| 359 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, |
| 360 usage2.isRuntimeTypeUsed); |
| 361 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, |
| 362 usage2.isIsolateInUse); |
| 363 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, |
| 364 usage2.isFunctionApplyUsed); |
| 365 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, |
| 366 usage2.isNoSuchMethodUsed); |
| 367 } |
| OLD | NEW |