| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library dart2js.serialization_model_test; | 5 library dart2js.serialization_model_test; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:io'; | 8 import 'dart:io'; |
| 9 import 'package:async_helper/async_helper.dart'; | 9 import 'package:async_helper/async_helper.dart'; |
| 10 import 'package:expect/expect.dart'; | 10 import 'package:expect/expect.dart'; |
| 11 import 'package:compiler/src/closure.dart'; | 11 import 'package:compiler/src/closure.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/constants/values.dart'; | 14 import 'package:compiler/src/constants/values.dart'; |
| 15 import 'package:compiler/src/compiler.dart'; | 15 import 'package:compiler/src/compiler.dart'; |
| 16 import 'package:compiler/src/dart_types.dart'; | 16 import 'package:compiler/src/dart_types.dart'; |
| 17 import 'package:compiler/src/deferred_load.dart'; | 17 import 'package:compiler/src/deferred_load.dart'; |
| 18 import 'package:compiler/src/elements/elements.dart'; | 18 import 'package:compiler/src/elements/elements.dart'; |
| 19 import 'package:compiler/src/enqueue.dart'; | 19 import 'package:compiler/src/enqueue.dart'; |
| 20 import 'package:compiler/src/filenames.dart'; | 20 import 'package:compiler/src/filenames.dart'; |
| 21 import 'package:compiler/src/js_backend/js_backend.dart'; | 21 import 'package:compiler/src/js_backend/js_backend.dart'; |
| 22 import 'package:compiler/src/serialization/equivalence.dart'; | 22 import 'package:compiler/src/serialization/equivalence.dart'; |
| 23 import 'package:compiler/src/tree/nodes.dart'; | 23 import 'package:compiler/src/tree/nodes.dart'; |
| 24 import 'package:compiler/src/universe/class_set.dart'; | 24 import 'package:compiler/src/universe/class_set.dart'; |
| 25 import 'package:compiler/src/universe/world_builder.dart'; |
| 26 import 'package:compiler/src/util/enumset.dart'; |
| 25 import 'package:compiler/src/world.dart' show ClosedWorld; | 27 import 'package:compiler/src/world.dart' show ClosedWorld; |
| 26 import '../memory_compiler.dart'; | 28 import '../memory_compiler.dart'; |
| 27 import 'helper.dart'; | 29 import 'helper.dart'; |
| 28 import 'test_data.dart'; | 30 import 'test_data.dart'; |
| 29 import 'test_helper.dart'; | 31 import 'test_helper.dart'; |
| 30 | 32 |
| 31 /// Number of tests that are not part of the automatic test grouping. | 33 /// Number of tests that are not part of the automatic test grouping. |
| 32 int SKIP_COUNT = 2; | 34 int SKIP_COUNT = 2; |
| 33 | 35 |
| 34 /// Number of groups that the [TESTS] are split into. | 36 /// Number of groups that the [TESTS] are split into. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 compilerNormal.closedWorld, compilerDeserialized.closedWorld, | 102 compilerNormal.closedWorld, compilerDeserialized.closedWorld, |
| 101 verbose: verbose); | 103 verbose: verbose); |
| 102 checkBackendInfo(compilerNormal, compilerDeserialized, verbose: verbose); | 104 checkBackendInfo(compilerNormal, compilerDeserialized, verbose: verbose); |
| 103 }); | 105 }); |
| 104 } | 106 } |
| 105 | 107 |
| 106 void checkResolutionEnqueuers( | 108 void checkResolutionEnqueuers( |
| 107 ResolutionEnqueuer enqueuer1, ResolutionEnqueuer enqueuer2, | 109 ResolutionEnqueuer enqueuer1, ResolutionEnqueuer enqueuer2, |
| 108 {bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, | 110 {bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, |
| 109 bool elementFilter(Element element), | 111 bool elementFilter(Element element), |
| 112 bool checkInstantiatedTypesAndClasses: true, |
| 110 bool verbose: false}) { | 113 bool verbose: false}) { |
| 111 Iterable<Element> processedElements1 = enqueuer1.processedElements; | 114 Iterable<Element> processedElements1 = enqueuer1.processedElements; |
| 112 Iterable<Element> processedElements2 = enqueuer2.processedElements; | 115 Iterable<Element> processedElements2 = enqueuer2.processedElements; |
| 113 if (elementFilter != null) { | 116 if (elementFilter != null) { |
| 114 processedElements1 = processedElements1.where(elementFilter); | 117 processedElements1 = processedElements1.where(elementFilter); |
| 115 processedElements2 = processedElements2.where(elementFilter); | 118 processedElements2 = processedElements2.where(elementFilter); |
| 116 } | 119 } |
| 117 | 120 |
| 118 checkSets(processedElements1, processedElements2, | 121 checkSets(processedElements1, processedElements2, |
| 119 "Processed element mismatch", areElementsEquivalent, | 122 "Processed element mismatch", areElementsEquivalent, |
| 120 verbose: verbose); | 123 verbose: verbose); |
| 121 | 124 |
| 122 checkSets( | 125 /// Normalize the instantiation map by removing redirections and converting |
| 123 enqueuer1.universe.directlyInstantiatedClasses, | 126 /// redirecting factories to their effective target. |
| 124 enqueuer2.universe.directlyInstantiatedClasses, | 127 Map<ClassElement, InstantiationInfo> createInstantiationMap( |
| 125 "Directly instantiated classes mismatch", | 128 ResolutionWorldBuilder worldBuilder) { |
| 129 Map<ClassElement, InstantiationInfo> instantiationMap = |
| 130 <ClassElement, InstantiationInfo>{}; |
| 131 |
| 132 InstantiationInfo infoFor(ClassElement cls) { |
| 133 return instantiationMap.putIfAbsent(cls, () => new InstantiationInfo()); |
| 134 } |
| 135 |
| 136 worldBuilder.forEachInstantiatedClass((cls, info) { |
| 137 if (info.instantiationMap != null) { |
| 138 info.instantiationMap |
| 139 .forEach((ConstructorElement constructor, Set<Instance> set) { |
| 140 for (Instance instance in set) { |
| 141 if (instance.isRedirection) { |
| 142 continue; |
| 143 } |
| 144 if (constructor == null || !constructor.isRedirectingFactory) { |
| 145 infoFor(cls) |
| 146 .addInstantiation(constructor, instance.type, instance.kind); |
| 147 } else { |
| 148 ConstructorElement target = constructor.effectiveTarget; |
| 149 InterfaceType targetType = |
| 150 constructor.computeEffectiveTargetType(instance.type); |
| 151 infoFor(targetType.element).addInstantiation( |
| 152 target, targetType, Instantiation.DIRECTLY_INSTANTIATED); |
| 153 } |
| 154 } |
| 155 }); |
| 156 } |
| 157 }); |
| 158 return instantiationMap; |
| 159 } |
| 160 |
| 161 checkMaps( |
| 162 createInstantiationMap(enqueuer1.universe), |
| 163 createInstantiationMap(enqueuer2.universe), |
| 164 "Instantiated classes mismatch", |
| 126 areElementsEquivalent, | 165 areElementsEquivalent, |
| 166 (a, b) => areInstantiationInfosEquivalent(a, b, typeEquivalence), |
| 127 verbose: verbose); | 167 verbose: verbose); |
| 168 if (checkInstantiatedTypesAndClasses) { |
| 169 checkSets( |
| 170 enqueuer1.universe.directlyInstantiatedClasses, |
| 171 enqueuer2.universe.directlyInstantiatedClasses, |
| 172 "Directly instantiated classes mismatch", |
| 173 areElementsEquivalent, |
| 174 verbose: verbose); |
| 128 | 175 |
| 129 checkSets( | 176 checkSets( |
| 130 enqueuer1.universe.instantiatedTypes, | 177 enqueuer1.universe.instantiatedTypes, |
| 131 enqueuer2.universe.instantiatedTypes, | 178 enqueuer2.universe.instantiatedTypes, |
| 132 "Instantiated types mismatch", | 179 "Instantiated types mismatch", |
| 133 typeEquivalence, | 180 typeEquivalence, |
| 134 verbose: verbose); | 181 verbose: verbose); |
| 182 } |
| 135 | 183 |
| 136 checkSets(enqueuer1.universe.isChecks, enqueuer2.universe.isChecks, | 184 checkSets(enqueuer1.universe.isChecks, enqueuer2.universe.isChecks, |
| 137 "Is-check mismatch", typeEquivalence, | 185 "Is-check mismatch", typeEquivalence, |
| 138 verbose: verbose); | 186 verbose: verbose); |
| 139 | 187 |
| 140 JavaScriptBackend backend1 = enqueuer1.backend; | 188 JavaScriptBackend backend1 = enqueuer1.backend; |
| 141 JavaScriptBackend backend2 = enqueuer2.backend; | 189 JavaScriptBackend backend2 = enqueuer2.backend; |
| 142 Expect.equals(backend1.hasInvokeOnSupport, backend2.hasInvokeOnSupport, | 190 Expect.equals(backend1.hasInvokeOnSupport, backend2.hasInvokeOnSupport, |
| 143 "Compiler.enabledInvokeOn mismatch"); | 191 "Compiler.enabledInvokeOn mismatch"); |
| 144 Expect.equals( | 192 Expect.equals( |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 check(outputUnit1, outputUnit2, 'OutputUnit.isMainOutput $message', | 460 check(outputUnit1, outputUnit2, 'OutputUnit.isMainOutput $message', |
| 413 outputUnit1.isMainOutput, outputUnit2.isMainOutput); | 461 outputUnit1.isMainOutput, outputUnit2.isMainOutput); |
| 414 checkSetEquivalence( | 462 checkSetEquivalence( |
| 415 outputUnit1, | 463 outputUnit1, |
| 416 outputUnit2, | 464 outputUnit2, |
| 417 'OutputUnit.imports $message', | 465 'OutputUnit.imports $message', |
| 418 outputUnit1.imports, | 466 outputUnit1.imports, |
| 419 outputUnit2.imports, | 467 outputUnit2.imports, |
| 420 (a, b) => areElementsEquivalent(a.declaration, b.declaration)); | 468 (a, b) => areElementsEquivalent(a.declaration, b.declaration)); |
| 421 } | 469 } |
| 470 |
| 471 bool areInstantiationInfosEquivalent(InstantiationInfo info1, |
| 472 InstantiationInfo info2, bool typeEquivalence(DartType a, DartType b)) { |
| 473 checkMaps( |
| 474 info1.instantiationMap, |
| 475 info2.instantiationMap, |
| 476 'instantiationMap of\n ' |
| 477 '${info1.instantiationMap}\nvs ${info2.instantiationMap}', |
| 478 areElementsEquivalent, |
| 479 (a, b) => areSetsEquivalent( |
| 480 a, b, (a, b) => areInstancesEquivalent(a, b, typeEquivalence))); |
| 481 return true; |
| 482 } |
| 483 |
| 484 bool areInstancesEquivalent(Instance instance1, Instance instance2, |
| 485 bool typeEquivalence(DartType a, DartType b)) { |
| 486 return typeEquivalence(instance1.type, instance2.type) && |
| 487 instance1.kind == instance2.kind && |
| 488 instance1.isRedirection == instance2.isRedirection; |
| 489 } |
| OLD | NEW |