| 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 /// Equivalence test functions for data objects. | 5 /// Equivalence test functions for data objects. |
| 6 | 6 |
| 7 library dart2js.equivalence.functions; | 7 library dart2js.equivalence.functions; |
| 8 | 8 |
| 9 import 'package:expect/expect.dart'; | 9 import 'package:expect/expect.dart'; |
| 10 import 'package:compiler/src/common/resolution.dart'; | 10 import 'package:compiler/src/common/resolution.dart'; |
| 11 import 'package:compiler/src/common_elements.dart'; | 11 import 'package:compiler/src/common_elements.dart'; |
| 12 import 'package:compiler/src/compiler.dart'; | 12 import 'package:compiler/src/compiler.dart'; |
| 13 import 'package:compiler/src/elements/types.dart'; | 13 import 'package:compiler/src/elements/types.dart'; |
| 14 import 'package:compiler/src/elements/elements.dart'; | 14 import 'package:compiler/src/elements/elements.dart'; |
| 15 import 'package:compiler/src/elements/entities.dart'; | 15 import 'package:compiler/src/elements/entities.dart'; |
| 16 import 'package:compiler/src/enqueue.dart'; | 16 import 'package:compiler/src/enqueue.dart'; |
| 17 import 'package:compiler/src/js_backend/backend_usage.dart'; | 17 import 'package:compiler/src/js_backend/backend_usage.dart'; |
| 18 import 'package:compiler/src/js_backend/enqueuer.dart'; |
| 18 import 'package:compiler/src/js_backend/native_data.dart'; | 19 import 'package:compiler/src/js_backend/native_data.dart'; |
| 19 import 'package:compiler/src/js_backend/interceptor_data.dart'; | 20 import 'package:compiler/src/js_backend/interceptor_data.dart'; |
| 20 import 'package:compiler/src/serialization/equivalence.dart'; | 21 import 'package:compiler/src/serialization/equivalence.dart'; |
| 21 import 'package:compiler/src/universe/class_set.dart'; | 22 import 'package:compiler/src/universe/class_set.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 'check_helpers.dart'; | 25 import 'check_helpers.dart'; |
| 25 | 26 |
| 26 void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2, | 27 void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2, |
| 27 {TestStrategy strategy: const TestStrategy(), | 28 {TestStrategy strategy: const TestStrategy(), |
| (...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 | 609 |
| 609 bool areInstancesEquivalent(Instance instance1, Instance instance2, | 610 bool areInstancesEquivalent(Instance instance1, Instance instance2, |
| 610 bool typeEquivalence(DartType a, DartType b)) { | 611 bool typeEquivalence(DartType a, DartType b)) { |
| 611 InterfaceType type1 = instance1.type; | 612 InterfaceType type1 = instance1.type; |
| 612 InterfaceType type2 = instance2.type; | 613 InterfaceType type2 = instance2.type; |
| 613 return typeEquivalence(type1, type2) && | 614 return typeEquivalence(type1, type2) && |
| 614 instance1.kind == instance2.kind && | 615 instance1.kind == instance2.kind && |
| 615 instance1.isRedirection == instance2.isRedirection; | 616 instance1.isRedirection == instance2.isRedirection; |
| 616 } | 617 } |
| 617 | 618 |
| 619 bool areAbstractUsagesEquivalent(AbstractUsage usage1, AbstractUsage usage2) { |
| 620 return usage1.hasSameUsage(usage2); |
| 621 } |
| 622 |
| 618 void checkResolutionEnqueuers( | 623 void checkResolutionEnqueuers( |
| 619 BackendUsage backendUsage1, | 624 BackendUsage backendUsage1, |
| 620 BackendUsage backendUsage2, | 625 BackendUsage backendUsage2, |
| 621 ResolutionEnqueuer enqueuer1, | 626 ResolutionEnqueuer enqueuer1, |
| 622 ResolutionEnqueuer enqueuer2, | 627 ResolutionEnqueuer enqueuer2, |
| 623 {bool elementEquivalence(Entity a, Entity b): areElementsEquivalent, | 628 {bool elementEquivalence(Entity a, Entity b): areElementsEquivalent, |
| 624 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, | 629 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, |
| 625 bool elementFilter(Element element), | 630 bool elementFilter(Element element), |
| 626 bool verbose: false}) { | 631 bool verbose: false, |
| 632 bool skipClassUsageTesting: false}) { |
| 633 elementFilter ??= (_) => true; |
| 634 |
| 627 ResolutionWorldBuilderBase worldBuilder1 = enqueuer1.worldBuilder; | 635 ResolutionWorldBuilderBase worldBuilder1 = enqueuer1.worldBuilder; |
| 628 ResolutionWorldBuilderBase worldBuilder2 = enqueuer2.worldBuilder; | 636 ResolutionWorldBuilderBase worldBuilder2 = enqueuer2.worldBuilder; |
| 629 | 637 |
| 630 checkSets( | 638 checkSets(worldBuilder1.instantiatedTypes, worldBuilder2.instantiatedTypes, |
| 631 enqueuer1.worldBuilder.instantiatedTypes, | 639 "Instantiated types mismatch", typeEquivalence, |
| 632 enqueuer2.worldBuilder.instantiatedTypes, | |
| 633 "Instantiated types mismatch", | |
| 634 typeEquivalence, | |
| 635 verbose: verbose); | 640 verbose: verbose); |
| 636 | 641 |
| 637 checkSets( | 642 checkSets( |
| 638 enqueuer1.worldBuilder.directlyInstantiatedClasses, | 643 worldBuilder1.directlyInstantiatedClasses, |
| 639 enqueuer2.worldBuilder.directlyInstantiatedClasses, | 644 worldBuilder2.directlyInstantiatedClasses, |
| 640 "Directly instantiated classes mismatch", | 645 "Directly instantiated classes mismatch", |
| 641 elementEquivalence, | 646 elementEquivalence, |
| 642 verbose: verbose); | 647 verbose: verbose); |
| 643 | 648 |
| 644 checkMaps( | 649 checkMaps( |
| 645 worldBuilder1.getInstantiationMap(), | 650 worldBuilder1.getInstantiationMap(), |
| 646 worldBuilder2.getInstantiationMap(), | 651 worldBuilder2.getInstantiationMap(), |
| 647 "Instantiated classes mismatch", | 652 "Instantiated classes mismatch", |
| 648 elementEquivalence, | 653 elementEquivalence, |
| 649 (a, b) => areInstantiationInfosEquivalent( | 654 (a, b) => areInstantiationInfosEquivalent( |
| 650 a, b, elementEquivalence, typeEquivalence), | 655 a, b, elementEquivalence, typeEquivalence), |
| 651 verbose: verbose); | 656 verbose: verbose); |
| 652 | 657 |
| 653 checkSets(enqueuer1.processedEntities, enqueuer2.processedEntities, | 658 checkSets(enqueuer1.processedEntities, enqueuer2.processedEntities, |
| 654 "Processed element mismatch", elementEquivalence, elementFilter: (e) { | 659 "Processed element mismatch", elementEquivalence, |
| 655 return elementFilter != null ? elementFilter(e) : true; | 660 elementFilter: elementFilter, verbose: verbose); |
| 656 }, verbose: verbose); | |
| 657 | 661 |
| 658 checkSets(enqueuer1.worldBuilder.isChecks, enqueuer2.worldBuilder.isChecks, | 662 checkSets(worldBuilder1.isChecks, worldBuilder2.isChecks, "Is-check mismatch", |
| 659 "Is-check mismatch", typeEquivalence, | 663 typeEquivalence, |
| 664 verbose: verbose); |
| 665 |
| 666 checkSets(worldBuilder1.closurizedMembers, worldBuilder2.closurizedMembers, |
| 667 "closurizedMembers", elementEquivalence, |
| 668 verbose: verbose); |
| 669 checkSets(worldBuilder1.fieldSetters, worldBuilder2.fieldSetters, |
| 670 "fieldSetters", elementEquivalence, |
| 671 verbose: verbose); |
| 672 checkSets( |
| 673 worldBuilder1.methodsNeedingSuperGetter, |
| 674 worldBuilder2.methodsNeedingSuperGetter, |
| 675 "methodsNeedingSuperGetter", |
| 676 elementEquivalence, |
| 677 verbose: verbose); |
| 678 |
| 679 if (!skipClassUsageTesting) { |
| 680 checkMaps( |
| 681 worldBuilder1.classUsageForTesting, |
| 682 worldBuilder2.classUsageForTesting, |
| 683 'classUsageForTesting', |
| 684 elementEquivalence, |
| 685 areAbstractUsagesEquivalent, |
| 686 verbose: verbose); |
| 687 } |
| 688 checkMaps( |
| 689 worldBuilder1.staticMemberUsageForTesting, |
| 690 worldBuilder2.staticMemberUsageForTesting, |
| 691 'staticMemberUsageForTesting', |
| 692 elementEquivalence, |
| 693 areAbstractUsagesEquivalent, |
| 694 keyFilter: elementFilter, |
| 695 verbose: verbose); |
| 696 checkMaps( |
| 697 worldBuilder1.instanceMemberUsageForTesting, |
| 698 worldBuilder2.instanceMemberUsageForTesting, |
| 699 'instanceMemberUsageForTesting', |
| 700 elementEquivalence, |
| 701 areAbstractUsagesEquivalent, |
| 660 verbose: verbose); | 702 verbose: verbose); |
| 661 | 703 |
| 662 Expect.equals(backendUsage1.isInvokeOnUsed, backendUsage2.isInvokeOnUsed, | 704 Expect.equals(backendUsage1.isInvokeOnUsed, backendUsage2.isInvokeOnUsed, |
| 663 "JavaScriptBackend.hasInvokeOnSupport mismatch"); | 705 "JavaScriptBackend.hasInvokeOnSupport mismatch"); |
| 664 Expect.equals( | 706 Expect.equals( |
| 665 backendUsage1.isFunctionApplyUsed, | 707 backendUsage1.isFunctionApplyUsed, |
| 666 backendUsage1.isFunctionApplyUsed, | 708 backendUsage1.isFunctionApplyUsed, |
| 667 "JavaScriptBackend.hasFunctionApplySupport mismatch"); | 709 "JavaScriptBackend.hasFunctionApplySupport mismatch"); |
| 668 Expect.equals( | 710 Expect.equals( |
| 669 backendUsage1.isRuntimeTypeUsed, | 711 backendUsage1.isRuntimeTypeUsed, |
| 670 backendUsage2.isRuntimeTypeUsed, | 712 backendUsage2.isRuntimeTypeUsed, |
| 671 "JavaScriptBackend.hasRuntimeTypeSupport mismatch"); | 713 "JavaScriptBackend.hasRuntimeTypeSupport mismatch"); |
| 672 Expect.equals(backendUsage1.isIsolateInUse, backendUsage2.isIsolateInUse, | 714 Expect.equals(backendUsage1.isIsolateInUse, backendUsage2.isIsolateInUse, |
| 673 "JavaScriptBackend.hasIsolateSupport mismatch"); | 715 "JavaScriptBackend.hasIsolateSupport mismatch"); |
| 674 } | 716 } |
| 717 |
| 718 void checkCodegenEnqueuers(CodegenEnqueuer enqueuer1, CodegenEnqueuer enqueuer2, |
| 719 {bool elementEquivalence(Entity a, Entity b): areElementsEquivalent, |
| 720 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, |
| 721 bool elementFilter(Element element), |
| 722 bool verbose: false}) { |
| 723 CodegenWorldBuilderImpl worldBuilder1 = enqueuer1.worldBuilder; |
| 724 CodegenWorldBuilderImpl worldBuilder2 = enqueuer2.worldBuilder; |
| 725 |
| 726 checkSets(worldBuilder1.instantiatedTypes, worldBuilder2.instantiatedTypes, |
| 727 "Instantiated types mismatch", typeEquivalence, |
| 728 verbose: verbose); |
| 729 |
| 730 checkSets( |
| 731 worldBuilder1.directlyInstantiatedClasses, |
| 732 worldBuilder2.directlyInstantiatedClasses, |
| 733 "Directly instantiated classes mismatch", |
| 734 elementEquivalence, |
| 735 verbose: verbose); |
| 736 |
| 737 checkSets(enqueuer1.processedEntities, enqueuer2.processedEntities, |
| 738 "Processed element mismatch", elementEquivalence, elementFilter: (e) { |
| 739 return elementFilter != null ? elementFilter(e) : true; |
| 740 }, verbose: verbose); |
| 741 |
| 742 checkSets(worldBuilder1.isChecks, worldBuilder2.isChecks, "Is-check mismatch", |
| 743 typeEquivalence, |
| 744 verbose: verbose); |
| 745 |
| 746 checkSets( |
| 747 worldBuilder1.allReferencedStaticFields, |
| 748 worldBuilder2.allReferencedStaticFields, |
| 749 "Directly instantiated classes mismatch", |
| 750 elementEquivalence, |
| 751 verbose: verbose); |
| 752 checkSets(worldBuilder1.closurizedMembers, worldBuilder2.closurizedMembers, |
| 753 "closurizedMembers", elementEquivalence, |
| 754 verbose: verbose); |
| 755 checkSets(worldBuilder1.processedClasses, worldBuilder2.processedClasses, |
| 756 "processedClasses", elementEquivalence, |
| 757 verbose: verbose); |
| 758 checkSets( |
| 759 worldBuilder1.methodsNeedingSuperGetter, |
| 760 worldBuilder2.methodsNeedingSuperGetter, |
| 761 "methodsNeedingSuperGetter", |
| 762 elementEquivalence, |
| 763 verbose: verbose); |
| 764 checkSets( |
| 765 worldBuilder1.staticFunctionsNeedingGetter, |
| 766 worldBuilder2.staticFunctionsNeedingGetter, |
| 767 "staticFunctionsNeedingGetter", |
| 768 elementEquivalence, |
| 769 verbose: verbose); |
| 770 |
| 771 checkMaps( |
| 772 worldBuilder1.classUsageForTesting, |
| 773 worldBuilder2.classUsageForTesting, |
| 774 'classUsageForTesting', |
| 775 elementEquivalence, |
| 776 areAbstractUsagesEquivalent, |
| 777 verbose: verbose); |
| 778 checkMaps( |
| 779 worldBuilder1.staticMemberUsageForTesting, |
| 780 worldBuilder2.staticMemberUsageForTesting, |
| 781 'staticMemberUsageForTesting', |
| 782 elementEquivalence, |
| 783 areAbstractUsagesEquivalent, |
| 784 verbose: verbose); |
| 785 checkMaps( |
| 786 worldBuilder1.instanceMemberUsageForTesting, |
| 787 worldBuilder2.instanceMemberUsageForTesting, |
| 788 'instanceMemberUsageForTesting', |
| 789 elementEquivalence, |
| 790 areAbstractUsagesEquivalent, |
| 791 verbose: verbose); |
| 792 } |
| OLD | NEW |