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/compiler.dart'; | 15 import 'package:compiler/src/compiler.dart'; |
15 import 'package:compiler/src/deferred_load.dart'; | 16 import 'package:compiler/src/deferred_load.dart'; |
16 import 'package:compiler/src/elements/elements.dart'; | 17 import 'package:compiler/src/elements/elements.dart'; |
17 import 'package:compiler/src/filenames.dart'; | 18 import 'package:compiler/src/filenames.dart'; |
18 import 'package:compiler/src/js_backend/js_backend.dart'; | 19 import 'package:compiler/src/js_backend/js_backend.dart'; |
19 import 'package:compiler/src/serialization/equivalence.dart'; | 20 import 'package:compiler/src/serialization/equivalence.dart'; |
20 import 'package:compiler/src/tree/nodes.dart'; | 21 import 'package:compiler/src/tree/nodes.dart'; |
21 import 'package:compiler/src/universe/class_set.dart'; | 22 import 'package:compiler/src/universe/class_set.dart'; |
22 import '../memory_compiler.dart'; | 23 import '../memory_compiler.dart'; |
23 import 'helper.dart'; | 24 import 'helper.dart'; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 Expect.equals(compilerNormal.enabledRuntimeType, | 155 Expect.equals(compilerNormal.enabledRuntimeType, |
155 compilerDeserialized.enabledRuntimeType, | 156 compilerDeserialized.enabledRuntimeType, |
156 "Compiler.enabledRuntimeType mismatch"); | 157 "Compiler.enabledRuntimeType mismatch"); |
157 Expect.equals(compilerNormal.hasIsolateSupport, | 158 Expect.equals(compilerNormal.hasIsolateSupport, |
158 compilerDeserialized.hasIsolateSupport, | 159 compilerDeserialized.hasIsolateSupport, |
159 "Compiler.hasIsolateSupport mismatch"); | 160 "Compiler.hasIsolateSupport mismatch"); |
160 Expect.equals( | 161 Expect.equals( |
161 compilerNormal.deferredLoadTask.isProgramSplit, | 162 compilerNormal.deferredLoadTask.isProgramSplit, |
162 compilerDeserialized.deferredLoadTask.isProgramSplit, | 163 compilerDeserialized.deferredLoadTask.isProgramSplit, |
163 "isProgramSplit mismatch"); | 164 "isProgramSplit mismatch"); |
| 165 |
| 166 Map<ConstantValue, OutputUnit> constants1 = |
| 167 compilerNormal.deferredLoadTask.outputUnitForConstantsForTesting; |
| 168 Map<ConstantValue, OutputUnit> constants2 = |
| 169 compilerDeserialized.deferredLoadTask.outputUnitForConstantsForTesting; |
| 170 checkSets( |
| 171 constants1.keys, |
| 172 constants2.keys, |
| 173 'deferredLoadTask._outputUnitForConstants.keys', |
| 174 areConstantValuesEquivalent, |
| 175 failOnUnfound: false, |
| 176 failOnExtra: false, |
| 177 onSameElement: (ConstantValue value1, ConstantValue value2) { |
| 178 OutputUnit outputUnit1 = constants1[value1]; |
| 179 OutputUnit outputUnit2 = constants2[value2]; |
| 180 checkOutputUnits(outputUnit1, outputUnit2, |
| 181 'for ${value1.toStructuredText()} ' |
| 182 'vs ${value2.toStructuredText()}'); |
| 183 }, |
| 184 onUnfoundElement: (ConstantValue value1) { |
| 185 OutputUnit outputUnit1 = constants1[value1]; |
| 186 Expect.isTrue(outputUnit1.isMainOutput, |
| 187 "Missing deferred constant: ${value1.toStructuredText()}"); |
| 188 }, |
| 189 onExtraElement: (ConstantValue value2) { |
| 190 OutputUnit outputUnit2 = constants2[value2]; |
| 191 Expect.isTrue(outputUnit2.isMainOutput, |
| 192 "Extra deferred constant: ${value2.toStructuredText()}"); |
| 193 }, |
| 194 elementToString: (a) { |
| 195 return '${a.toStructuredText()} -> ${constants1[a]}/${constants2[a]}'; |
| 196 }); |
164 }); | 197 }); |
165 } | 198 } |
166 | 199 |
167 void checkElements( | 200 void checkElements( |
168 Compiler compiler1, Compiler compiler2, | 201 Compiler compiler1, Compiler compiler2, |
169 Element element1, Element element2, | 202 Element element1, Element element2, |
170 {bool verbose: false}) { | 203 {bool verbose: false}) { |
171 if (element1.isFunction || | 204 if (element1.isFunction || |
172 element1.isConstructor || | 205 element1.isConstructor || |
173 (element1.isField && element1.isInstanceMember)) { | 206 (element1.isField && element1.isInstanceMember)) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 }); | 270 }); |
238 } | 271 } |
239 } | 272 } |
240 JavaScriptBackend backend1 = compiler1.backend; | 273 JavaScriptBackend backend1 = compiler1.backend; |
241 JavaScriptBackend backend2 = compiler2.backend; | 274 JavaScriptBackend backend2 = compiler2.backend; |
242 Expect.equals( | 275 Expect.equals( |
243 backend1.inlineCache.getCurrentCacheDecisionForTesting(element1), | 276 backend1.inlineCache.getCurrentCacheDecisionForTesting(element1), |
244 backend2.inlineCache.getCurrentCacheDecisionForTesting(element2), | 277 backend2.inlineCache.getCurrentCacheDecisionForTesting(element2), |
245 "Inline cache decision mismatch for $element1 vs $element2"); | 278 "Inline cache decision mismatch for $element1 vs $element2"); |
246 | 279 |
247 checkOutputUnits(compiler1, compiler2, element1, element2); | 280 checkElementOutputUnits(compiler1, compiler2, element1, element2); |
248 } | 281 } |
249 | 282 |
250 void checkMixinUses( | 283 void checkMixinUses( |
251 Compiler compiler1, Compiler compiler2, | 284 Compiler compiler1, Compiler compiler2, |
252 ClassElement class1, ClassElement class2, | 285 ClassElement class1, ClassElement class2, |
253 {bool verbose: false}) { | 286 {bool verbose: false}) { |
254 | 287 |
255 checkSets( | 288 checkSets( |
256 compiler1.world.mixinUsesOf(class1), | 289 compiler1.world.mixinUsesOf(class1), |
257 compiler2.world.mixinUsesOf(class2), | 290 compiler2.world.mixinUsesOf(class2), |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 } | 386 } |
354 | 387 |
355 String nodeToString(Node node) { | 388 String nodeToString(Node node) { |
356 String text = '$node'; | 389 String text = '$node'; |
357 if (text.length > 40) { | 390 if (text.length > 40) { |
358 return '(${node.runtimeType}) ${text.substring(0, 37)}...'; | 391 return '(${node.runtimeType}) ${text.substring(0, 37)}...'; |
359 } | 392 } |
360 return '(${node.runtimeType}) $text'; | 393 return '(${node.runtimeType}) $text'; |
361 } | 394 } |
362 | 395 |
363 void checkOutputUnits(Compiler compiler1, Compiler compiler2, Element element1, | 396 void checkElementOutputUnits( |
364 Element element2) { | 397 Compiler compiler1, Compiler compiler2, |
| 398 Element element1, Element element2) { |
365 OutputUnit outputUnit1 = | 399 OutputUnit outputUnit1 = |
366 compiler1.deferredLoadTask.outputUnitForElement(element1); | 400 compiler1.deferredLoadTask.getOutputUnitForElementForTesting(element1); |
367 OutputUnit outputUnit2 = | 401 OutputUnit outputUnit2 = |
368 compiler2.deferredLoadTask.outputUnitForElement(element2); | 402 compiler2.deferredLoadTask.getOutputUnitForElementForTesting(element2); |
| 403 checkOutputUnits(outputUnit1, outputUnit2, 'for $element1 vs $element2'); |
| 404 } |
| 405 |
| 406 void checkOutputUnits( |
| 407 OutputUnit outputUnit1, OutputUnit outputUnit2, String message) { |
| 408 if (outputUnit1 == null && outputUnit2 == null) return; |
369 check(outputUnit1, outputUnit2, | 409 check(outputUnit1, outputUnit2, |
370 'OutputUnit.isMainOutput for $element1 vs $element2', | 410 'OutputUnit.isMainOutput $message', |
371 outputUnit1.isMainOutput, outputUnit2.isMainOutput); | 411 outputUnit1.isMainOutput, outputUnit2.isMainOutput); |
372 checkSetEquivalence(outputUnit1, outputUnit2, | 412 checkSetEquivalence(outputUnit1, outputUnit2, |
373 'OutputUnit.imports for $element1 vs $element2', | 413 'OutputUnit.imports $message', |
374 outputUnit1.imports, outputUnit2.imports, | 414 outputUnit1.imports, outputUnit2.imports, |
375 (a, b) => areElementsEquivalent(a.declaration, b.declaration)); | 415 (a, b) => areElementsEquivalent(a.declaration, b.declaration)); |
376 } | 416 } |
OLD | NEW |