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 // Helper to test compilation equivalence between source and .dill based | 5 // Helper to test compilation equivalence between source and .dill based |
6 // compilation. | 6 // compilation. |
7 library dart2js.kernel.compile_from_dill_test_helper; | 7 library dart2js.kernel.compile_from_dill_test_helper; |
8 | 8 |
9 import 'dart:async'; | 9 import 'dart:async'; |
10 import 'dart:io'; | 10 import 'dart:io'; |
11 | 11 |
12 import 'package:compiler/compiler_new.dart'; | 12 import 'package:compiler/compiler_new.dart'; |
13 import 'package:compiler/src/commandline_options.dart'; | 13 import 'package:compiler/src/commandline_options.dart'; |
14 import 'package:compiler/src/common.dart'; | 14 import 'package:compiler/src/common.dart'; |
15 import 'package:compiler/src/compiler.dart'; | 15 import 'package:compiler/src/compiler.dart'; |
16 import 'package:compiler/src/elements/elements.dart'; | 16 import 'package:compiler/src/elements/elements.dart'; |
17 import 'package:compiler/src/elements/types.dart'; | 17 import 'package:compiler/src/elements/types.dart'; |
18 import 'package:compiler/src/kernel/element_map.dart'; | 18 import 'package:compiler/src/kernel/element_map.dart'; |
| 19 import 'package:compiler/src/kernel/kernel_backend_strategy.dart'; |
19 import 'package:compiler/src/kernel/kernel_strategy.dart'; | 20 import 'package:compiler/src/kernel/kernel_strategy.dart'; |
20 import 'package:compiler/src/serialization/equivalence.dart'; | 21 import 'package:compiler/src/serialization/equivalence.dart'; |
21 import 'package:compiler/src/resolution/enum_creator.dart'; | 22 import 'package:compiler/src/resolution/enum_creator.dart'; |
22 import 'package:compiler/src/universe/world_builder.dart'; | 23 import 'package:compiler/src/universe/world_builder.dart'; |
23 import 'package:compiler/src/world.dart'; | 24 import 'package:compiler/src/world.dart'; |
24 import 'package:expect/expect.dart'; | 25 import 'package:expect/expect.dart'; |
25 import '../memory_compiler.dart'; | 26 import '../memory_compiler.dart'; |
26 import '../equivalence/check_functions.dart'; | 27 import '../equivalence/check_functions.dart'; |
27 import '../equivalence/check_helpers.dart'; | 28 import '../equivalence/check_helpers.dart'; |
28 import '../serialization/helper.dart'; | 29 import '../serialization/helper.dart'; |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 OutputCollector collector2 = new OutputCollector(); | 230 OutputCollector collector2 = new OutputCollector(); |
230 Compiler compiler2 = await compileWithDill( | 231 Compiler compiler2 = await compileWithDill( |
231 entryPoint, const {}, <String>[]..addAll(commonOptions)..addAll(options), | 232 entryPoint, const {}, <String>[]..addAll(commonOptions)..addAll(options), |
232 printSteps: true, compilerOutput: collector2); | 233 printSteps: true, compilerOutput: collector2); |
233 | 234 |
234 KernelFrontEndStrategy frontendStrategy = compiler2.frontendStrategy; | 235 KernelFrontEndStrategy frontendStrategy = compiler2.frontendStrategy; |
235 KernelToElementMap elementMap = frontendStrategy.elementMap; | 236 KernelToElementMap elementMap = frontendStrategy.elementMap; |
236 | 237 |
237 Expect.isFalse(compiler2.compilationFailed); | 238 Expect.isFalse(compiler2.compilationFailed); |
238 | 239 |
239 KernelEquivalence equivalence = new KernelEquivalence(elementMap); | 240 KernelEquivalence equivalence1 = new KernelEquivalence(elementMap); |
240 | 241 |
241 ClosedWorld closedWorld2 = | 242 ClosedWorld closedWorld2 = |
242 compiler2.resolutionWorldBuilder.closedWorldForTesting; | 243 compiler2.resolutionWorldBuilder.closedWorldForTesting; |
243 | 244 |
244 checkBackendUsage(closedWorld1.backendUsage, closedWorld2.backendUsage, | 245 checkBackendUsage(closedWorld1.backendUsage, closedWorld2.backendUsage, |
245 equivalence.defaultStrategy); | 246 equivalence1.defaultStrategy); |
246 | 247 |
247 print('--- checking resolution enqueuers ----------------------------------'); | 248 print('--- checking resolution enqueuers ----------------------------------'); |
248 checkResolutionEnqueuers(closedWorld1.backendUsage, closedWorld2.backendUsage, | 249 checkResolutionEnqueuers(closedWorld1.backendUsage, closedWorld2.backendUsage, |
249 compiler1.enqueuer.resolution, compiler2.enqueuer.resolution, | 250 compiler1.enqueuer.resolution, compiler2.enqueuer.resolution, |
250 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b), | 251 elementEquivalence: (a, b) => equivalence1.entityEquivalence(a, b), |
251 typeEquivalence: (DartType a, DartType b) { | 252 typeEquivalence: (DartType a, DartType b) { |
252 return equivalence.typeEquivalence(unalias(a), b); | 253 return equivalence1.typeEquivalence(unalias(a), b); |
253 }, | 254 }, |
254 elementFilter: elementFilter, | 255 elementFilter: elementFilter, |
255 verbose: verbose); | 256 verbose: verbose); |
256 | 257 |
257 print('--- checking closed worlds -----------------------------------------'); | 258 print('--- checking closed worlds -----------------------------------------'); |
258 checkClosedWorlds(closedWorld1, closedWorld2, | 259 checkClosedWorlds(closedWorld1, closedWorld2, |
259 strategy: equivalence.defaultStrategy, | 260 strategy: equivalence1.defaultStrategy, |
260 verbose: verbose, | 261 verbose: verbose, |
261 // TODO(johnniwinther,efortuna): Require closure class equivalence when | 262 // TODO(johnniwinther,efortuna): Require closure class equivalence when |
262 // these are supported. | 263 // these are supported. |
263 allowMissingClosureClasses: true); | 264 allowMissingClosureClasses: true); |
264 | 265 |
265 // TODO(johnniwinther): Perform equivalence tests on the model: codegen world | 266 // TODO(johnniwinther): Perform equivalence tests on the model: codegen world |
266 // impacts, program model, etc. | 267 // impacts, program model, etc. |
267 | 268 |
268 print('--- checking codegen enqueuers--------------------------------------'); | 269 print('--- checking codegen enqueuers--------------------------------------'); |
| 270 |
| 271 KernelBackendStrategy backendStrategy = compiler2.backendStrategy; |
| 272 KernelEquivalence equivalence2 = |
| 273 new KernelEquivalence(backendStrategy.elementMap); |
| 274 |
269 checkCodegenEnqueuers(compiler1.enqueuer.codegenEnqueuerForTesting, | 275 checkCodegenEnqueuers(compiler1.enqueuer.codegenEnqueuerForTesting, |
270 compiler2.enqueuer.codegenEnqueuerForTesting, | 276 compiler2.enqueuer.codegenEnqueuerForTesting, |
271 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b), | 277 elementEquivalence: (a, b) => equivalence2.entityEquivalence(a, b), |
272 typeEquivalence: (DartType a, DartType b) { | 278 typeEquivalence: (DartType a, DartType b) { |
273 return equivalence.typeEquivalence(unalias(a), b); | 279 return equivalence2.typeEquivalence(unalias(a), b); |
274 }, | 280 }, |
275 elementFilter: elementFilter, | 281 elementFilter: elementFilter, |
276 verbose: verbose); | 282 verbose: verbose); |
277 | 283 |
278 checkEmitters(compiler1.backend.emitter, compiler2.backend.emitter, | 284 checkEmitters(compiler1.backend.emitter, compiler2.backend.emitter, |
279 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b), | 285 elementEquivalence: (a, b) => equivalence2.entityEquivalence(a, b), |
280 typeEquivalence: (DartType a, DartType b) { | 286 typeEquivalence: (DartType a, DartType b) { |
281 return equivalence.typeEquivalence(unalias(a), b); | 287 return equivalence2.typeEquivalence(unalias(a), b); |
282 }, | 288 }, |
283 verbose: verbose); | 289 verbose: verbose); |
284 | 290 |
285 if (expectAstEquivalence) { | 291 if (expectAstEquivalence) { |
286 checkGeneratedCode(compiler1.backend, compiler2.backend, | 292 checkGeneratedCode(compiler1.backend, compiler2.backend, |
287 elementEquivalence: (a, b) => equivalence.entityEquivalence(a, b)); | 293 elementEquivalence: (a, b) => equivalence2.entityEquivalence(a, b)); |
288 } | 294 } |
289 | 295 |
290 if (expectIdenticalOutput) { | 296 if (expectIdenticalOutput) { |
291 print('--- checking output------- ---------------------------------------'); | 297 print('--- checking output------- ---------------------------------------'); |
292 collector1.outputMap | 298 collector1.outputMap |
293 .forEach((OutputType outputType, Map<String, BufferedOutputSink> map1) { | 299 .forEach((OutputType outputType, Map<String, BufferedOutputSink> map1) { |
294 if (outputType == OutputType.sourceMap) { | 300 if (outputType == OutputType.sourceMap) { |
295 // TODO(johnniwinther): Support source map from .dill. | 301 // TODO(johnniwinther): Support source map from .dill. |
296 return; | 302 return; |
297 } | 303 } |
298 Map<String, BufferedOutputSink> map2 = collector2.outputMap[outputType]; | 304 Map<String, BufferedOutputSink> map2 = collector2.outputMap[outputType]; |
299 checkSets(map1.keys, map2.keys, 'output', equality); | 305 checkSets(map1.keys, map2.keys, 'output', equality); |
300 map1.forEach((String name, BufferedOutputSink output1) { | 306 map1.forEach((String name, BufferedOutputSink output1) { |
301 BufferedOutputSink output2 = map2[name]; | 307 BufferedOutputSink output2 = map2[name]; |
302 Expect.stringEquals(output1.text, output2.text); | 308 Expect.stringEquals(output1.text, output2.text); |
303 }); | 309 }); |
304 }); | 310 }); |
305 } | 311 } |
306 return ResultKind.success; | 312 return ResultKind.success; |
307 } | 313 } |
OLD | NEW |