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/compiler.dart'; | 14 import 'package:compiler/src/compiler.dart'; |
| 15 import 'package:compiler/src/deferred_load.dart'; |
14 import 'package:compiler/src/elements/elements.dart'; | 16 import 'package:compiler/src/elements/elements.dart'; |
15 import 'package:compiler/src/filenames.dart'; | 17 import 'package:compiler/src/filenames.dart'; |
16 import 'package:compiler/src/js_backend/js_backend.dart'; | 18 import 'package:compiler/src/js_backend/js_backend.dart'; |
17 import 'package:compiler/src/serialization/equivalence.dart'; | 19 import 'package:compiler/src/serialization/equivalence.dart'; |
18 import 'package:compiler/src/tree/nodes.dart'; | 20 import 'package:compiler/src/tree/nodes.dart'; |
19 import 'package:compiler/src/universe/class_set.dart'; | 21 import 'package:compiler/src/universe/class_set.dart'; |
20 import '../memory_compiler.dart'; | 22 import '../memory_compiler.dart'; |
21 import 'helper.dart'; | 23 import 'helper.dart'; |
22 import 'test_data.dart'; | 24 import 'test_data.dart'; |
23 import 'test_helper.dart'; | 25 import 'test_helper.dart'; |
24 | 26 |
25 main(List<String> args) { | 27 main(List<String> args) { |
26 asyncTest(() async { | 28 asyncTest(() async { |
27 Arguments arguments = new Arguments.from(args); | 29 Arguments arguments = new Arguments.from(args); |
28 SerializedData serializedData = | 30 SerializedData serializedData = |
29 await serializeDartCore(arguments: arguments); | 31 await serializeDartCore(arguments: arguments); |
30 if (arguments.filename != null) { | 32 if (arguments.filename != null) { |
31 Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename)); | 33 Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename)); |
| 34 print('----------------------------------------------------------------'); |
| 35 print('serialize ${entryPoint}'); |
| 36 print('----------------------------------------------------------------'); |
| 37 SerializationResult result = await serialize( |
| 38 entryPoint, |
| 39 memorySourceFiles: serializedData.toMemorySourceFiles(), |
| 40 resolutionInputs: serializedData.toUris(), |
| 41 dataUri: Uri.parse('memory:test.data')); |
32 await checkModels(entryPoint, | 42 await checkModels(entryPoint, |
33 sourceFiles: serializedData.toMemorySourceFiles(), | 43 sourceFiles: serializedData.toMemorySourceFiles( |
34 resolutionInputs: serializedData.toUris()); | 44 result.serializedData.toMemorySourceFiles()), |
| 45 resolutionInputs: serializedData.toUris( |
| 46 result.serializedData.toUris())); |
35 } else { | 47 } else { |
36 Uri entryPoint = Uri.parse('memory:main.dart'); | 48 Uri entryPoint = Uri.parse('memory:main.dart'); |
37 await arguments.forEachTest(serializedData, TESTS, checkModels); | 49 await arguments.forEachTest(serializedData, TESTS, checkModels); |
38 } | 50 } |
39 }); | 51 }); |
40 } | 52 } |
41 | 53 |
42 Future checkModels( | 54 Future checkModels( |
43 Uri entryPoint, | 55 Uri entryPoint, |
44 {Map<String, String> sourceFiles: const <String, String>{}, | 56 {Map<String, String> sourceFiles: const <String, String>{}, |
45 List<Uri> resolutionInputs, | 57 List<Uri> resolutionInputs, |
46 int index, | 58 int index, |
47 Test test, | 59 Test test, |
48 bool verbose: false}) async { | 60 bool verbose: false}) async { |
49 String testDescription = test != null ? test.name : '${entryPoint}'; | 61 String testDescription = test != null ? test.name : '${entryPoint}'; |
50 String id = index != null ? '$index: ' : ''; | 62 String id = index != null ? '$index: ' : ''; |
51 print('------------------------------------------------------------------'); | 63 print('------------------------------------------------------------------'); |
52 print('compile normal ${id}${testDescription}'); | 64 print('compile normal ${id}${testDescription}'); |
53 print('------------------------------------------------------------------'); | 65 print('------------------------------------------------------------------'); |
54 Compiler compilerNormal = compilerFor( | 66 Compiler compilerNormal = compilerFor( |
55 memorySourceFiles: sourceFiles, | 67 memorySourceFiles: sourceFiles, |
56 options: [Flags.analyzeOnly]); | 68 options: [Flags.analyzeOnly]); |
57 compilerNormal.resolution.retainCachesForTesting = true; | 69 compilerNormal.resolution.retainCachesForTesting = true; |
58 await compilerNormal.run(entryPoint); | 70 await compilerNormal.run(entryPoint); |
59 compilerNormal.phase = Compiler.PHASE_DONE_RESOLVING; | 71 compilerNormal.phase = Compiler.PHASE_DONE_RESOLVING; |
60 compilerNormal.world.populate(); | 72 compilerNormal.world.populate(); |
61 compilerNormal.backend.onResolutionComplete(); | 73 compilerNormal.backend.onResolutionComplete(); |
| 74 compilerNormal.deferredLoadTask.onResolutionComplete( |
| 75 compilerNormal.mainFunction); |
62 | 76 |
63 print('------------------------------------------------------------------'); | 77 print('------------------------------------------------------------------'); |
64 print('compile deserialized ${id}${testDescription}'); | 78 print('compile deserialized ${id}${testDescription}'); |
65 print('------------------------------------------------------------------'); | 79 print('------------------------------------------------------------------'); |
66 Compiler compilerDeserialized = compilerFor( | 80 Compiler compilerDeserialized = compilerFor( |
67 memorySourceFiles: sourceFiles, | 81 memorySourceFiles: sourceFiles, |
68 resolutionInputs: resolutionInputs, | 82 resolutionInputs: resolutionInputs, |
69 options: [Flags.analyzeOnly]); | 83 options: [Flags.analyzeOnly]); |
70 compilerDeserialized.resolution.retainCachesForTesting = true; | 84 compilerDeserialized.resolution.retainCachesForTesting = true; |
71 await compilerDeserialized.run(entryPoint); | 85 await compilerDeserialized.run(entryPoint); |
72 compilerDeserialized.phase = Compiler.PHASE_DONE_RESOLVING; | 86 compilerDeserialized.phase = Compiler.PHASE_DONE_RESOLVING; |
73 compilerDeserialized.world.populate(); | 87 compilerDeserialized.world.populate(); |
74 compilerDeserialized.backend.onResolutionComplete(); | 88 compilerDeserialized.backend.onResolutionComplete(); |
| 89 compilerDeserialized.deferredLoadTask.onResolutionComplete( |
| 90 compilerDeserialized.mainFunction); |
75 | 91 |
76 checkAllImpacts( | 92 checkAllImpacts( |
77 compilerNormal, compilerDeserialized, | 93 compilerNormal, compilerDeserialized, |
78 verbose: verbose); | 94 verbose: verbose); |
79 | 95 |
80 checkSets( | 96 checkSets( |
81 compilerNormal.resolverWorld.directlyInstantiatedClasses, | 97 compilerNormal.resolverWorld.directlyInstantiatedClasses, |
82 compilerDeserialized.resolverWorld.directlyInstantiatedClasses, | 98 compilerDeserialized.resolverWorld.directlyInstantiatedClasses, |
83 "Directly instantiated classes mismatch", | 99 "Directly instantiated classes mismatch", |
84 areElementsEquivalent, | 100 areElementsEquivalent, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 "Compiler.enabledInvokeOn mismatch"); | 139 "Compiler.enabledInvokeOn mismatch"); |
124 Expect.equals(compilerNormal.enabledFunctionApply, | 140 Expect.equals(compilerNormal.enabledFunctionApply, |
125 compilerDeserialized.enabledFunctionApply, | 141 compilerDeserialized.enabledFunctionApply, |
126 "Compiler.enabledFunctionApply mismatch"); | 142 "Compiler.enabledFunctionApply mismatch"); |
127 Expect.equals(compilerNormal.enabledRuntimeType, | 143 Expect.equals(compilerNormal.enabledRuntimeType, |
128 compilerDeserialized.enabledRuntimeType, | 144 compilerDeserialized.enabledRuntimeType, |
129 "Compiler.enabledRuntimeType mismatch"); | 145 "Compiler.enabledRuntimeType mismatch"); |
130 Expect.equals(compilerNormal.hasIsolateSupport, | 146 Expect.equals(compilerNormal.hasIsolateSupport, |
131 compilerDeserialized.hasIsolateSupport, | 147 compilerDeserialized.hasIsolateSupport, |
132 "Compiler.hasIsolateSupport mismatch"); | 148 "Compiler.hasIsolateSupport mismatch"); |
| 149 Expect.equals( |
| 150 compilerNormal.deferredLoadTask.isProgramSplit, |
| 151 compilerDeserialized.deferredLoadTask.isProgramSplit, |
| 152 "isProgramSplit mismatch"); |
133 } | 153 } |
134 | 154 |
135 void checkElements( | 155 void checkElements( |
136 Compiler compiler1, Compiler compiler2, | 156 Compiler compiler1, Compiler compiler2, |
137 Element element1, Element element2, | 157 Element element1, Element element2, |
138 {bool verbose: false}) { | 158 {bool verbose: false}) { |
139 if (element1.isFunction || | 159 if (element1.isFunction || |
140 element1.isConstructor || | 160 element1.isConstructor || |
141 (element1.isField && element1.isInstanceMember)) { | 161 (element1.isField && element1.isInstanceMember)) { |
142 AstElement astElement1 = element1; | 162 AstElement astElement1 = element1; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 const CheckStrategy()); | 224 const CheckStrategy()); |
205 }); | 225 }); |
206 } | 226 } |
207 } | 227 } |
208 JavaScriptBackend backend1 = compiler1.backend; | 228 JavaScriptBackend backend1 = compiler1.backend; |
209 JavaScriptBackend backend2 = compiler2.backend; | 229 JavaScriptBackend backend2 = compiler2.backend; |
210 Expect.equals( | 230 Expect.equals( |
211 backend1.inlineCache.getCurrentCacheDecisionForTesting(element1), | 231 backend1.inlineCache.getCurrentCacheDecisionForTesting(element1), |
212 backend2.inlineCache.getCurrentCacheDecisionForTesting(element2), | 232 backend2.inlineCache.getCurrentCacheDecisionForTesting(element2), |
213 "Inline cache decision mismatch for $element1 vs $element2"); | 233 "Inline cache decision mismatch for $element1 vs $element2"); |
| 234 |
| 235 checkOutputUnits(compiler1, compiler2, element1, element2); |
214 } | 236 } |
215 | 237 |
216 void checkMixinUses( | 238 void checkMixinUses( |
217 Compiler compiler1, Compiler compiler2, | 239 Compiler compiler1, Compiler compiler2, |
218 ClassElement class1, ClassElement class2, | 240 ClassElement class1, ClassElement class2, |
219 {bool verbose: false}) { | 241 {bool verbose: false}) { |
220 | 242 |
221 checkSets( | 243 checkSets( |
222 compiler1.world.mixinUsesOf(class1), | 244 compiler1.world.mixinUsesOf(class1), |
223 compiler2.world.mixinUsesOf(class2), | 245 compiler2.world.mixinUsesOf(class2), |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 areElementsEquivalent); | 339 areElementsEquivalent); |
318 return true; | 340 return true; |
319 } | 341 } |
320 | 342 |
321 String nodeToString(Node node) { | 343 String nodeToString(Node node) { |
322 String text = '$node'; | 344 String text = '$node'; |
323 if (text.length > 40) { | 345 if (text.length > 40) { |
324 return '(${node.runtimeType}) ${text.substring(0, 37)}...'; | 346 return '(${node.runtimeType}) ${text.substring(0, 37)}...'; |
325 } | 347 } |
326 return '(${node.runtimeType}) $text'; | 348 return '(${node.runtimeType}) $text'; |
| 349 } |
| 350 |
| 351 void checkOutputUnits(Compiler compiler1, Compiler compiler2, Element element1, |
| 352 Element element2) { |
| 353 OutputUnit outputUnit1 = |
| 354 compiler1.deferredLoadTask.outputUnitForElement(element1); |
| 355 OutputUnit outputUnit2 = |
| 356 compiler2.deferredLoadTask.outputUnitForElement(element2); |
| 357 check(outputUnit1, outputUnit2, |
| 358 'OutputUnit.isMainOutput for $element1 vs $element2', |
| 359 outputUnit1.isMainOutput, outputUnit2.isMainOutput); |
| 360 checkSetEquivalence(outputUnit1, outputUnit2, |
| 361 'OutputUnit.imports for $element1 vs $element2', |
| 362 outputUnit1.imports, outputUnit2.imports, |
| 363 (a, b) => areElementsEquivalent(a.declaration, b.declaration)); |
327 } | 364 } |
OLD | NEW |