Chromium Code Reviews| 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'; | |
| 16 import 'package:compiler/src/common/tasks.dart'; | |
| 17 import 'package:compiler/src/compiler.dart'; | 15 import 'package:compiler/src/compiler.dart'; |
| 18 import 'package:compiler/src/deferred_load.dart'; | |
| 19 import 'package:compiler/src/elements/entities.dart'; | |
| 20 import 'package:compiler/src/elements/resolution_types.dart'; | 16 import 'package:compiler/src/elements/resolution_types.dart'; |
| 21 import 'package:compiler/src/elements/types.dart'; | 17 import 'package:compiler/src/elements/types.dart'; |
| 22 import 'package:compiler/src/enqueue.dart'; | 18 import 'package:compiler/src/enqueue.dart'; |
| 23 import 'package:compiler/src/js_backend/backend.dart' | |
| 24 hide RuntimeTypesNeedBuilderImpl; | |
| 25 import 'package:compiler/src/js_backend/backend_impact.dart'; | |
| 26 import 'package:compiler/src/js_backend/backend_usage.dart'; | 19 import 'package:compiler/src/js_backend/backend_usage.dart'; |
| 27 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; | |
| 28 import 'package:compiler/src/js_backend/native_data.dart'; | |
| 29 import 'package:compiler/src/js_backend/impact_transformer.dart'; | |
| 30 import 'package:compiler/src/js_backend/interceptor_data.dart'; | |
| 31 import 'package:compiler/src/js_backend/lookup_map_analysis.dart'; | |
| 32 import 'package:compiler/src/js_backend/mirrors_analysis.dart' | |
| 33 hide MirrorsResolutionAnalysisImpl; | |
| 34 import 'package:compiler/src/js_backend/mirrors_data.dart'; | |
| 35 import 'package:compiler/src/js_backend/no_such_method_registry.dart'; | |
| 36 import 'package:compiler/src/js_backend/resolution_listener.dart'; | |
| 37 import 'package:compiler/src/js_backend/type_variable_handler.dart'; | |
| 38 import 'package:compiler/src/native/enqueue.dart'; | |
| 39 import 'package:compiler/src/native/resolver.dart'; | |
| 40 import 'package:compiler/src/kernel/element_map_impl.dart'; | 20 import 'package:compiler/src/kernel/element_map_impl.dart'; |
| 41 import 'package:compiler/src/kernel/kernel_strategy.dart'; | 21 import 'package:compiler/src/kernel/kernel_strategy.dart'; |
| 42 import 'package:compiler/src/library_loader.dart'; | 22 import 'package:compiler/src/serialization/equivalence.dart'; |
| 43 import 'package:compiler/src/options.dart'; | |
| 44 import 'package:compiler/src/universe/world_builder.dart'; | 23 import 'package:compiler/src/universe/world_builder.dart'; |
| 45 import 'package:compiler/src/util/util.dart'; | 24 import 'package:compiler/src/util/util.dart'; |
| 46 import 'package:compiler/src/world.dart'; | 25 import 'package:compiler/src/world.dart'; |
| 47 import 'package:expect/expect.dart'; | 26 import 'package:expect/expect.dart'; |
| 48 import 'package:kernel/ast.dart' as ir; | |
| 49 import '../memory_compiler.dart'; | 27 import '../memory_compiler.dart'; |
| 50 import '../serialization/helper.dart'; | 28 import '../serialization/helper.dart'; |
| 51 import '../serialization/model_test_helper.dart'; | 29 import '../equivalence/check_functions.dart'; |
| 52 import '../serialization/test_helper.dart'; | |
| 53 | |
| 54 import 'closed_world_test.dart' hide KernelWorkItemBuilder; | |
| 55 import 'compiler_helper.dart'; | 30 import 'compiler_helper.dart'; |
| 56 import 'impact_test.dart'; | 31 import 'test_helpers.dart'; |
| 57 | 32 |
| 58 const SOURCE = const { | 33 const SOURCE = const { |
| 59 'main.dart': ''' | 34 'main.dart': ''' |
| 60 import 'dart:html'; | 35 import 'dart:html'; |
| 61 import 'dart:typed_data'; | 36 import 'dart:typed_data'; |
| 62 import 'package:expect/expect.dart'; | 37 import 'package:expect/expect.dart'; |
| 63 | 38 |
| 64 class ClassWithSetter { | 39 class ClassWithSetter { |
| 65 void set setter(_) {} | 40 void set setter(_) {} |
| 66 } | 41 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 150 Compiler compiler = compilers.a; | 125 Compiler compiler = compilers.a; |
| 151 compiler.resolutionWorldBuilder.closeWorld(); | 126 compiler.resolutionWorldBuilder.closeWorld(); |
| 152 ElementEnvironment environment1 = compiler.elementEnvironment; | 127 ElementEnvironment environment1 = compiler.elementEnvironment; |
| 153 | 128 |
| 154 Compiler compiler2 = compilers.b; | 129 Compiler compiler2 = compilers.b; |
| 155 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy; | 130 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy; |
| 156 KernelToElementMapImpl elementMap = frontEndStrategy.elementMap; | 131 KernelToElementMapImpl elementMap = frontEndStrategy.elementMap; |
| 157 Expect.isFalse(compiler2.compilationFailed); | 132 Expect.isFalse(compiler2.compilationFailed); |
| 158 | 133 |
| 159 KernelEquivalence equivalence = new KernelEquivalence(elementMap); | 134 KernelEquivalence equivalence = new KernelEquivalence(elementMap); |
| 135 TestStrategy strategy = equivalence.defaultStrategy; | |
| 160 | 136 |
| 161 ElementEnvironment environment2 = compiler2.elementEnvironment; | 137 ElementEnvironment environment2 = compiler2.elementEnvironment; |
| 162 checkElementEnvironment(environment1, environment2, equivalence); | 138 checkElementEnvironment(environment1, environment2, strategy); |
| 163 | 139 |
| 164 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution; | 140 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution; |
| 165 BackendUsage backendUsage2 = compiler2.backend.backendUsage; | 141 BackendUsage backendUsage2 = compiler2.backend.backendUsage; |
| 166 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld(); | 142 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld(); |
| 167 | 143 |
| 168 checkNativeClasses(compiler1, compiler2, equivalence); | 144 checkNativeClasses(compiler1, compiler2, strategy); |
| 169 | 145 |
| 170 checkBackendUsage(backendUsage1, backendUsage2, equivalence); | 146 checkBackendUsage(backendUsage1, backendUsage2, strategy); |
| 171 | 147 |
| 172 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, | 148 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, |
| 173 elementEquivalence: equivalence.entityEquivalence, | 149 elementEquivalence: equivalence.entityEquivalence, |
| 174 typeEquivalence: (ResolutionDartType a, DartType b) { | 150 typeEquivalence: (ResolutionDartType a, DartType b) { |
| 175 return equivalence.typeEquivalence(unalias(a), b); | 151 return equivalence.typeEquivalence(unalias(a), b); |
| 176 }, elementFilter: elementFilter, verbose: arguments.verbose); | 152 }, elementFilter: elementFilter, verbose: arguments.verbose); |
| 177 | 153 |
| 178 checkClosedWorlds(closedWorld1, closedWorld2, | 154 checkClosedWorlds(closedWorld1, closedWorld2, |
| 179 strategy: equivalence.defaultStrategy, verbose: arguments.verbose); | 155 strategy: equivalence.defaultStrategy, verbose: arguments.verbose); |
| 180 | 156 |
| 181 return ResultKind.success; | 157 return ResultKind.success; |
| 182 } | 158 } |
| 183 | |
| 184 void checkNativeClasses( | |
|
Johnni Winther
2017/05/15 07:43:03
These were changed to used [TestStrategy] instead
| |
| 185 Compiler compiler1, Compiler compiler2, KernelEquivalence equivalence) { | |
| 186 Iterable<ClassEntity> nativeClasses1 = compiler1 | |
| 187 .backend.nativeResolutionEnqueuerForTesting.nativeClassesForTesting; | |
| 188 Iterable<ClassEntity> nativeClasses2 = compiler2 | |
| 189 .backend.nativeResolutionEnqueuerForTesting.nativeClassesForTesting; | |
| 190 | |
| 191 checkSetEquivalence(compiler1, compiler2, 'nativeClasses', nativeClasses1, | |
| 192 nativeClasses2, equivalence.entityEquivalence); | |
| 193 | |
| 194 Iterable<ClassEntity> registeredClasses1 = compiler1 | |
| 195 .backend.nativeResolutionEnqueuerForTesting.registeredClassesForTesting; | |
| 196 Iterable<ClassEntity> registeredClasses2 = compiler2 | |
| 197 .backend.nativeResolutionEnqueuerForTesting.registeredClassesForTesting; | |
| 198 | |
| 199 checkSetEquivalence(compiler1, compiler2, 'registeredClasses', | |
| 200 registeredClasses1, registeredClasses2, equivalence.entityEquivalence); | |
| 201 } | |
| 202 | |
| 203 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2, | |
| 204 KernelEquivalence equivalence) { | |
| 205 checkMapEquivalence( | |
| 206 data1, | |
| 207 data2, | |
| 208 'nativeClassTagInfo', | |
| 209 data1.nativeClassTagInfo, | |
| 210 data2.nativeClassTagInfo, | |
| 211 equivalence.entityEquivalence, | |
| 212 (a, b) => a == b); | |
| 213 // TODO(johnniwinther): Check the remaining properties. | |
| 214 } | |
| 215 | |
| 216 void checkBackendUsage(BackendUsageImpl usage1, BackendUsageImpl usage2, | |
| 217 KernelEquivalence equivalence) { | |
| 218 checkSetEquivalence( | |
| 219 usage1, | |
| 220 usage2, | |
| 221 'globalClassDependencies', | |
| 222 usage1.globalClassDependencies, | |
| 223 usage2.globalClassDependencies, | |
| 224 equivalence.entityEquivalence); | |
| 225 checkSetEquivalence( | |
| 226 usage1, | |
| 227 usage2, | |
| 228 'globalFunctionDependencies', | |
| 229 usage1.globalFunctionDependencies, | |
| 230 usage2.globalFunctionDependencies, | |
| 231 equivalence.entityEquivalence); | |
| 232 checkSetEquivalence( | |
| 233 usage1, | |
| 234 usage2, | |
| 235 'helperClassesUsed', | |
| 236 usage1.helperClassesUsed, | |
| 237 usage2.helperClassesUsed, | |
| 238 equivalence.entityEquivalence); | |
| 239 checkSetEquivalence( | |
| 240 usage1, | |
| 241 usage2, | |
| 242 'helperFunctionsUsed', | |
| 243 usage1.helperFunctionsUsed, | |
| 244 usage2.helperFunctionsUsed, | |
| 245 equivalence.entityEquivalence); | |
| 246 check( | |
| 247 usage1, | |
| 248 usage2, | |
| 249 'needToInitializeIsolateAffinityTag', | |
| 250 usage1.needToInitializeIsolateAffinityTag, | |
| 251 usage2.needToInitializeIsolateAffinityTag); | |
| 252 check( | |
| 253 usage1, | |
| 254 usage2, | |
| 255 'needToInitializeDispatchProperty', | |
| 256 usage1.needToInitializeDispatchProperty, | |
| 257 usage2.needToInitializeDispatchProperty); | |
| 258 check(usage1, usage2, 'requiresPreamble', usage1.requiresPreamble, | |
| 259 usage2.requiresPreamble); | |
| 260 check(usage1, usage2, 'isInvokeOnUsed', usage1.isInvokeOnUsed, | |
| 261 usage2.isInvokeOnUsed); | |
| 262 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, | |
| 263 usage2.isRuntimeTypeUsed); | |
| 264 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, | |
| 265 usage2.isIsolateInUse); | |
| 266 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, | |
| 267 usage2.isFunctionApplyUsed); | |
| 268 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, | |
| 269 usage2.isNoSuchMethodUsed); | |
| 270 } | |
| 271 | |
| 272 checkElementEnvironment(ElementEnvironment env1, ElementEnvironment env2, | |
| 273 KernelEquivalence equivalence) { | |
| 274 checkMembers(MemberEntity member1, MemberEntity member2) { | |
| 275 Expect.equals(env1.isDeferredLoadLibraryGetter(member1), | |
| 276 env2.isDeferredLoadLibraryGetter(member2)); | |
| 277 | |
| 278 checkListEquivalence( | |
| 279 member1, | |
| 280 member2, | |
| 281 'metadata', | |
| 282 env1.getMemberMetadata(member1), | |
| 283 env2.getMemberMetadata(member2), | |
| 284 equivalence.defaultStrategy.testConstantValues); | |
| 285 } | |
| 286 | |
| 287 checkSetEquivalence(env1, env2, 'libraries', env1.libraries, env2.libraries, | |
| 288 equivalence.entityEquivalence, | |
| 289 onSameElement: (LibraryEntity lib1, LibraryEntity lib2) { | |
| 290 Expect.identical(lib1, env1.lookupLibrary(lib1.canonicalUri)); | |
| 291 Expect.identical(lib2, env2.lookupLibrary(lib2.canonicalUri)); | |
| 292 | |
| 293 List<ClassEntity> classes2 = <ClassEntity>[]; | |
| 294 env1.forEachClass(lib1, (ClassEntity cls1) { | |
| 295 Expect.identical(cls1, env1.lookupClass(lib1, cls1.name)); | |
| 296 | |
| 297 String className = cls1.name; | |
| 298 ClassEntity cls2 = env2.lookupClass(lib2, className); | |
| 299 Expect.isNotNull(cls2, 'Missing class $className in $lib2'); | |
| 300 Expect.identical(cls2, env2.lookupClass(lib2, cls2.name)); | |
| 301 | |
| 302 check(lib1, lib2, 'class:${className}', cls1, cls2, | |
| 303 equivalence.entityEquivalence); | |
| 304 | |
| 305 Expect.equals(env1.isGenericClass(cls1), env2.isGenericClass(cls2)); | |
| 306 | |
| 307 check( | |
| 308 cls1, | |
| 309 cls2, | |
| 310 'superclass', | |
| 311 env1.getSuperClass(cls1, skipUnnamedMixinApplications: false), | |
| 312 env2.getSuperClass(cls2, skipUnnamedMixinApplications: false), | |
| 313 equivalence.entityEquivalence); | |
| 314 check( | |
| 315 cls1, | |
| 316 cls2, | |
| 317 'superclass', | |
| 318 env1.getSuperClass(cls1, skipUnnamedMixinApplications: true), | |
| 319 env2.getSuperClass(cls2, skipUnnamedMixinApplications: true), | |
| 320 equivalence.entityEquivalence); | |
| 321 | |
| 322 List<InterfaceType> supertypes1 = <InterfaceType>[]; | |
| 323 env1.forEachSupertype(cls1, supertypes1.add); | |
| 324 List<InterfaceType> supertypes2 = <InterfaceType>[]; | |
| 325 env2.forEachSupertype(cls2, supertypes1.add); | |
| 326 equivalence.defaultStrategy | |
| 327 .testTypeLists(cls1, cls2, 'supertypes', supertypes1, supertypes2); | |
| 328 | |
| 329 List<ClassEntity> mixins1 = <ClassEntity>[]; | |
| 330 env1.forEachMixin(cls1, mixins1.add); | |
| 331 List<ClassEntity> mixins2 = <ClassEntity>[]; | |
| 332 env2.forEachMixin(cls2, mixins2.add); | |
| 333 equivalence.defaultStrategy.testLists(cls1, cls2, 'mixins', mixins1, | |
| 334 mixins2, equivalence.entityEquivalence); | |
| 335 | |
| 336 Map<MemberEntity, ClassEntity> members1 = <MemberEntity, ClassEntity>{}; | |
| 337 Map<MemberEntity, ClassEntity> members2 = <MemberEntity, ClassEntity>{}; | |
| 338 env1.forEachClassMember(cls1, | |
| 339 (ClassEntity declarer1, MemberEntity member1) { | |
| 340 if (cls1 == declarer1) { | |
| 341 Expect.identical( | |
| 342 member1, | |
| 343 env1.lookupClassMember(cls1, member1.name, | |
| 344 setter: member1.isSetter)); | |
| 345 } | |
| 346 members1[member1] = declarer1; | |
| 347 }); | |
| 348 env2.forEachClassMember(cls2, | |
| 349 (ClassEntity declarer2, MemberEntity member2) { | |
| 350 if (cls2 == declarer2) { | |
| 351 Expect.identical( | |
| 352 member2, | |
| 353 env2.lookupClassMember(cls2, member2.name, | |
| 354 setter: member2.isSetter)); | |
| 355 } | |
| 356 members2[member2] = declarer2; | |
| 357 }); | |
| 358 checkMapEquivalence(cls1, cls2, 'members', members1, members2, (a, b) { | |
| 359 bool result = equivalence.entityEquivalence(a, b); | |
| 360 if (result) checkMembers(a, b); | |
| 361 return result; | |
| 362 }, equivalence.entityEquivalence); | |
| 363 | |
| 364 classes2.add(cls2); | |
| 365 }); | |
| 366 env2.forEachClass(lib2, (ClassEntity cls2) { | |
| 367 Expect.isTrue(classes2.contains(cls2), "Extra class $cls2 in $lib2"); | |
| 368 }); | |
| 369 }); | |
| 370 // TODO(johnniwinther): Test the remaining properties of [ElementEnvironment]. | |
| 371 } | |
| OLD | NEW |