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 /// Normal the instantiation map by removing redirections and converting |
Harry Terkelsen
2016/11/18 00:11:35
Normal -> Normalize
Johnni Winther
2016/11/18 09:52:49
Done.
| |
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 |