| 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'; | 9 import 'dart:async'; |
| 10 | 10 |
| 11 import 'package:async_helper/async_helper.dart'; | 11 import 'package:async_helper/async_helper.dart'; |
| 12 import 'package:compiler/src/commandline_options.dart'; | 12 import 'package:compiler/src/commandline_options.dart'; |
| 13 import 'package:compiler/src/common.dart'; | 13 import 'package:compiler/src/common.dart'; |
| 14 import 'package:compiler/src/common_elements.dart'; | 14 import 'package:compiler/src/common_elements.dart'; |
| 15 import 'package:compiler/src/common/backend_api.dart'; | 15 import 'package:compiler/src/common/backend_api.dart'; |
| 16 import 'package:compiler/src/common/tasks.dart'; | 16 import 'package:compiler/src/common/tasks.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/entities.dart'; |
| 19 import 'package:compiler/src/elements/resolution_types.dart'; | 20 import 'package:compiler/src/elements/resolution_types.dart'; |
| 20 import 'package:compiler/src/elements/types.dart'; | 21 import 'package:compiler/src/elements/types.dart'; |
| 21 import 'package:compiler/src/enqueue.dart'; | 22 import 'package:compiler/src/enqueue.dart'; |
| 22 import 'package:compiler/src/js_backend/backend.dart' | 23 import 'package:compiler/src/js_backend/backend.dart' |
| 23 hide RuntimeTypesNeedBuilderImpl; | 24 hide RuntimeTypesNeedBuilderImpl; |
| 24 import 'package:compiler/src/js_backend/backend_impact.dart'; | 25 import 'package:compiler/src/js_backend/backend_impact.dart'; |
| 25 import 'package:compiler/src/js_backend/backend_usage.dart'; | 26 import 'package:compiler/src/js_backend/backend_usage.dart'; |
| 26 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; | 27 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; |
| 27 import 'package:compiler/src/js_backend/native_data.dart'; | 28 import 'package:compiler/src/js_backend/native_data.dart'; |
| 28 import 'package:compiler/src/js_backend/impact_transformer.dart'; | 29 import 'package:compiler/src/js_backend/impact_transformer.dart'; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 54 | 55 |
| 55 const SOURCE = const { | 56 const SOURCE = const { |
| 56 'main.dart': ''' | 57 'main.dart': ''' |
| 57 import 'dart:html'; | 58 import 'dart:html'; |
| 58 import 'package:expect/expect.dart'; | 59 import 'package:expect/expect.dart'; |
| 59 | 60 |
| 60 class ClassWithSetter { | 61 class ClassWithSetter { |
| 61 void set setter(_) {} | 62 void set setter(_) {} |
| 62 } | 63 } |
| 63 | 64 |
| 65 class Mixin { |
| 66 method1() {} |
| 67 method2() {} |
| 68 method3() {} |
| 69 } |
| 70 class Class1 = Object with Mixin; |
| 71 class Class2 extends Object with Mixin { |
| 72 method3() {} |
| 73 } |
| 74 |
| 75 |
| 64 @NoInline() | 76 @NoInline() |
| 65 main() { | 77 main() { |
| 66 print('Hello World'); | 78 print('Hello World'); |
| 67 ''.contains; // Trigger member closurization. | 79 ''.contains; // Trigger member closurization. |
| 68 new Element.div(); | 80 new Element.div(); |
| 69 new ClassWithSetter().setter = null; | 81 new ClassWithSetter().setter = null; |
| 82 new Class1().method1(); |
| 83 new Class2().method2(); |
| 84 new Class2().method3(); |
| 70 } | 85 } |
| 71 ''' | 86 ''' |
| 72 }; | 87 }; |
| 73 | 88 |
| 74 main(List<String> args) { | 89 main(List<String> args) { |
| 75 asyncTest(() async { | 90 asyncTest(() async { |
| 76 await mainInternal(args); | 91 await mainInternal(args); |
| 77 }); | 92 }); |
| 78 } | 93 } |
| 79 | 94 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 BackendUsage backendUsage1 = compiler1.backend.backendUsage; | 130 BackendUsage backendUsage1 = compiler1.backend.backendUsage; |
| 116 ClosedWorld closedWorld1 = compiler1.resolutionWorldBuilder.closeWorld(); | 131 ClosedWorld closedWorld1 = compiler1.resolutionWorldBuilder.closeWorld(); |
| 117 | 132 |
| 118 print('---- analyze-all -------------------------------------------------'); | 133 print('---- analyze-all -------------------------------------------------'); |
| 119 Compiler compiler = compilerFor( | 134 Compiler compiler = compilerFor( |
| 120 entryPoint: entryPoint, | 135 entryPoint: entryPoint, |
| 121 memorySourceFiles: memorySourceFiles, | 136 memorySourceFiles: memorySourceFiles, |
| 122 options: [Flags.analyzeAll, Flags.useKernel, Flags.enableAssertMessage]); | 137 options: [Flags.analyzeAll, Flags.useKernel, Flags.enableAssertMessage]); |
| 123 await compiler.run(entryPoint); | 138 await compiler.run(entryPoint); |
| 124 compiler.resolutionWorldBuilder.closeWorld(); | 139 compiler.resolutionWorldBuilder.closeWorld(); |
| 140 ElementEnvironment environment1 = compiler.elementEnvironment; |
| 125 | 141 |
| 126 print('---- closed world from kernel ------------------------------------'); | 142 print('---- closed world from kernel ------------------------------------'); |
| 127 Compiler compiler2 = compilerFor( | 143 Compiler compiler2 = compilerFor( |
| 128 entryPoint: entryPoint, | 144 entryPoint: entryPoint, |
| 129 memorySourceFiles: memorySourceFiles, | 145 memorySourceFiles: memorySourceFiles, |
| 130 options: [ | 146 options: [ |
| 131 Flags.analyzeOnly, | 147 Flags.analyzeOnly, |
| 132 Flags.enableAssertMessage, | 148 Flags.enableAssertMessage, |
| 133 Flags.loadFromDill | 149 Flags.loadFromDill |
| 134 ]); | 150 ]); |
| 135 ElementResolutionWorldBuilder.useInstantiationMap = true; | 151 ElementResolutionWorldBuilder.useInstantiationMap = true; |
| 136 compiler2.resolution.retainCachesForTesting = true; | 152 compiler2.resolution.retainCachesForTesting = true; |
| 137 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy; | 153 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy; |
| 138 KernelToElementMap elementMap = frontEndStrategy.elementMap; | 154 KernelToElementMap elementMap = frontEndStrategy.elementMap; |
| 139 compiler2.libraryLoader = new MemoryDillLibraryLoaderTask( | 155 compiler2.libraryLoader = new MemoryDillLibraryLoaderTask( |
| 140 elementMap, | 156 elementMap, |
| 141 compiler2.reporter, | 157 compiler2.reporter, |
| 142 compiler2.measurer, | 158 compiler2.measurer, |
| 143 compiler.backend.kernelTask.program); | 159 compiler.backend.kernelTask.program); |
| 144 await compiler2.run(entryPoint); | 160 await compiler2.run(entryPoint); |
| 145 Expect.isFalse(compiler2.compilationFailed); | 161 Expect.isFalse(compiler2.compilationFailed); |
| 162 |
| 163 KernelEquivalence equivalence = new KernelEquivalence(elementMap); |
| 164 |
| 165 ElementEnvironment environment2 = compiler2.elementEnvironment; |
| 166 checkElementEnvironment(environment1, environment2, equivalence); |
| 167 |
| 146 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution; | 168 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution; |
| 147 BackendUsage backendUsage2 = compiler2.backend.backendUsage; | 169 BackendUsage backendUsage2 = compiler2.backend.backendUsage; |
| 148 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld(); | 170 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld(); |
| 149 KernelEquivalence equivalence = new KernelEquivalence(elementMap); | |
| 150 checkBackendUsage(backendUsage1, backendUsage2, equivalence); | 171 checkBackendUsage(backendUsage1, backendUsage2, equivalence); |
| 151 | 172 |
| 152 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, | 173 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, |
| 153 elementEquivalence: equivalence.entityEquivalence, | 174 elementEquivalence: equivalence.entityEquivalence, |
| 154 typeEquivalence: (ResolutionDartType a, DartType b) { | 175 typeEquivalence: (ResolutionDartType a, DartType b) { |
| 155 return equivalence.typeEquivalence(unalias(a), b); | 176 return equivalence.typeEquivalence(unalias(a), b); |
| 156 }, elementFilter: elementFilter, verbose: arguments.verbose); | 177 }, elementFilter: elementFilter, verbose: arguments.verbose); |
| 157 | 178 |
| 158 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence, | 179 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence, |
| 159 verbose: arguments.verbose); | 180 verbose: arguments.verbose); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, | 308 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, |
| 288 usage2.isRuntimeTypeUsed); | 309 usage2.isRuntimeTypeUsed); |
| 289 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, | 310 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, |
| 290 usage2.isIsolateInUse); | 311 usage2.isIsolateInUse); |
| 291 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, | 312 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, |
| 292 usage2.isFunctionApplyUsed); | 313 usage2.isFunctionApplyUsed); |
| 293 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, | 314 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, |
| 294 usage2.isNoSuchMethodUsed); | 315 usage2.isNoSuchMethodUsed); |
| 295 } | 316 } |
| 296 | 317 |
| 318 checkElementEnvironment(ElementEnvironment env1, ElementEnvironment env2, |
| 319 KernelEquivalence equivalence) { |
| 320 checkSetEquivalence(env1, env2, 'libraries', env1.libraries, env2.libraries, |
| 321 equivalence.entityEquivalence, |
| 322 onSameElement: (LibraryEntity lib1, LibraryEntity lib2) { |
| 323 List<ClassEntity> classes2 = <ClassEntity>[]; |
| 324 env1.forEachClass(lib1, (ClassEntity cls1) { |
| 325 String className = cls1.name; |
| 326 ClassEntity cls2 = env2.lookupClass(lib2, className); |
| 327 Expect.isNotNull(cls2, 'Missing class $className in $lib2'); |
| 328 check(lib1, lib2, 'class:${className}', cls1, cls2, |
| 329 equivalence.entityEquivalence); |
| 330 |
| 331 check(cls1, cls2, 'superclass', env1.getSuperClass(cls1), |
| 332 env2.getSuperClass(cls2), equivalence.entityEquivalence); |
| 333 |
| 334 Map<MemberEntity, ClassEntity> members1 = <MemberEntity, ClassEntity>{}; |
| 335 Map<MemberEntity, ClassEntity> members2 = <MemberEntity, ClassEntity>{}; |
| 336 env1.forEachClassMember(cls1, |
| 337 (ClassEntity declarer1, MemberEntity member1) { |
| 338 members1[member1] = declarer1; |
| 339 }); |
| 340 env1.forEachClassMember(cls1, |
| 341 (ClassEntity declarer2, MemberEntity member2) { |
| 342 members2[member2] = declarer2; |
| 343 }); |
| 344 checkMapEquivalence(cls1, cls2, 'members', members1, members2, |
| 345 equivalence.entityEquivalence, equivalence.entityEquivalence); |
| 346 |
| 347 classes2.add(cls2); |
| 348 }); |
| 349 env2.forEachClass(lib2, (ClassEntity cls2) { |
| 350 Expect.isTrue(classes2.contains(cls2), "Extra class $cls2 in $lib2"); |
| 351 }); |
| 352 }); |
| 353 |
| 354 // TODO(johnniwinther): Test the remaining properties of [ElementEnvironment]. |
| 355 } |
| 356 |
| 297 class MemoryDillLibraryLoaderTask extends DillLibraryLoaderTask { | 357 class MemoryDillLibraryLoaderTask extends DillLibraryLoaderTask { |
| 298 final ir.Program program; | 358 final ir.Program program; |
| 299 | 359 |
| 300 MemoryDillLibraryLoaderTask(KernelToElementMap elementMap, | 360 MemoryDillLibraryLoaderTask(KernelToElementMap elementMap, |
| 301 DiagnosticReporter reporter, Measurer measurer, this.program) | 361 DiagnosticReporter reporter, Measurer measurer, this.program) |
| 302 : super(elementMap, null, null, reporter, measurer); | 362 : super(elementMap, null, null, reporter, measurer); |
| 303 | 363 |
| 304 Future<LoadedLibraries> loadLibrary(Uri resolvedUri, | 364 Future<LoadedLibraries> loadLibrary(Uri resolvedUri, |
| 305 {bool skipFileWithPartOfTag: false}) async { | 365 {bool skipFileWithPartOfTag: false}) async { |
| 306 return createLoadedLibraries(program); | 366 return createLoadedLibraries(program); |
| 307 } | 367 } |
| 308 } | 368 } |
| OLD | NEW |