Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Side by Side Diff: tests/compiler/dart2js/equivalence/check_functions.dart

Issue 2975933002: Check emitter constants and fix tearOffName for JConstructorBody (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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';
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 checkMaps( 796 checkMaps(
797 worldBuilder1.instanceMemberUsageForTesting, 797 worldBuilder1.instanceMemberUsageForTesting,
798 worldBuilder2.instanceMemberUsageForTesting, 798 worldBuilder2.instanceMemberUsageForTesting,
799 'instanceMemberUsageForTesting', 799 'instanceMemberUsageForTesting',
800 elementEquivalence, 800 elementEquivalence,
801 areAbstractUsagesEquivalent, 801 areAbstractUsagesEquivalent,
802 verbose: verbose); 802 verbose: verbose);
803 } 803 }
804 804
805 // TODO(johnniwinther): Check all emitter properties. 805 // TODO(johnniwinther): Check all emitter properties.
806 void checkEmitters(CodeEmitterTask emitter1, CodeEmitterTask emitter2, 806 void checkEmitters(
807 CodeEmitterTask emitter1, CodeEmitterTask emitter2, TestStrategy strategy,
807 {bool elementEquivalence(Entity a, Entity b): _areEntitiesEquivalent, 808 {bool elementEquivalence(Entity a, Entity b): _areEntitiesEquivalent,
808 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, 809 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent,
809 bool elementFilter(Element element), 810 bool elementFilter(Element element),
810 bool verbose: false}) { 811 bool verbose: false}) {
811 checkEmitterPrograms( 812 checkEmitterPrograms(emitter1.emitter.programForTesting,
812 emitter1.emitter.programForTesting, emitter2.emitter.programForTesting); 813 emitter2.emitter.programForTesting, strategy);
813 814
814 checkSets( 815 checkSets(
815 emitter1.typeTestRegistry.rtiNeededClasses, 816 emitter1.typeTestRegistry.rtiNeededClasses,
816 emitter2.typeTestRegistry.rtiNeededClasses, 817 emitter2.typeTestRegistry.rtiNeededClasses,
817 "TypeTestRegistry rti needed classes mismatch", 818 "TypeTestRegistry rti needed classes mismatch",
818 elementEquivalence, 819 strategy.elementEquivalence,
819 verbose: verbose); 820 verbose: verbose);
820 821
821 checkSets( 822 checkSets(
822 emitter1.typeTestRegistry.checkedFunctionTypes, 823 emitter1.typeTestRegistry.checkedFunctionTypes,
823 emitter2.typeTestRegistry.checkedFunctionTypes, 824 emitter2.typeTestRegistry.checkedFunctionTypes,
824 "TypeTestRegistry checked function types mismatch", 825 "TypeTestRegistry checked function types mismatch",
825 typeEquivalence, 826 strategy.typeEquivalence,
826 verbose: verbose); 827 verbose: verbose);
827 828
828 checkSets( 829 checkSets(
829 emitter1.typeTestRegistry.checkedClasses, 830 emitter1.typeTestRegistry.checkedClasses,
830 emitter2.typeTestRegistry.checkedClasses, 831 emitter2.typeTestRegistry.checkedClasses,
831 "TypeTestRegistry checked classes mismatch", 832 "TypeTestRegistry checked classes mismatch",
832 elementEquivalence, 833 strategy.elementEquivalence,
833 verbose: verbose); 834 verbose: verbose);
834 } 835 }
835 836
836 void checkEmitterPrograms(Program program1, Program program2) { 837 void checkEmitterPrograms(
838 Program program1, Program program2, TestStrategy strategy) {
837 checkLists(program1.fragments, program2.fragments, 'fragments', 839 checkLists(program1.fragments, program2.fragments, 'fragments',
838 (a, b) => a.outputFileName == b.outputFileName, 840 (a, b) => a.outputFileName == b.outputFileName,
839 onSameElement: checkEmitterFragments); 841 onSameElement: (a, b) => checkEmitterFragments(a, b, strategy));
840 checkLists( 842 checkLists(
841 program1.holders, program2.holders, 'holders', (a, b) => a.name == b.name, 843 program1.holders, program2.holders, 'holders', (a, b) => a.name == b.name,
842 onSameElement: checkEmitterHolders); 844 onSameElement: checkEmitterHolders);
843 check(program1, program2, 'outputContainsConstantList', 845 check(program1, program2, 'outputContainsConstantList',
844 program1.outputContainsConstantList, program2.outputContainsConstantList); 846 program1.outputContainsConstantList, program2.outputContainsConstantList);
845 check(program1, program2, 'needsNativeSupport', program1.needsNativeSupport, 847 check(program1, program2, 'needsNativeSupport', program1.needsNativeSupport,
846 program2.needsNativeSupport); 848 program2.needsNativeSupport);
847 check(program1, program2, 'hasIsolateSupport', program1.hasIsolateSupport, 849 check(program1, program2, 'hasIsolateSupport', program1.hasIsolateSupport,
848 program2.hasIsolateSupport); 850 program2.hasIsolateSupport);
849 check(program1, program2, 'hasSoftDeferredClasses', 851 check(program1, program2, 'hasSoftDeferredClasses',
(...skipping 12 matching lines...) Expand all
862 program1, 864 program1,
863 program2, 865 program2,
864 'typeToInterceptorMap', 866 'typeToInterceptorMap',
865 program1.typeToInterceptorMap, 867 program1.typeToInterceptorMap,
866 program2.typeToInterceptorMap, 868 program2.typeToInterceptorMap,
867 areJsNodesEquivalent); 869 areJsNodesEquivalent);
868 check(program1, program2, 'metadata', program1.metadata, program2.metadata, 870 check(program1, program2, 'metadata', program1.metadata, program2.metadata,
869 areJsNodesEquivalent); 871 areJsNodesEquivalent);
870 } 872 }
871 873
872 void checkEmitterFragments(Fragment fragment1, Fragment fragment2) { 874 void checkEmitterFragments(
875 Fragment fragment1, Fragment fragment2, TestStrategy strategy) {
873 // TODO(johnniwinther): Check outputUnit. 876 // TODO(johnniwinther): Check outputUnit.
874 checkLists(fragment1.libraries, fragment2.libraries, 'libraries', 877 checkLists(fragment1.libraries, fragment2.libraries, 'libraries',
875 (a, b) => a.element.canonicalUri == b.element.canonicalUri, 878 (a, b) => a.element.canonicalUri == b.element.canonicalUri,
876 onSameElement: checkEmitterLibraries); 879 onSameElement: (a, b) => checkEmitterLibraries(a, b, strategy));
877 checkLists(fragment1.constants, fragment2.constants, 'constants', 880 checkLists(fragment1.constants, fragment2.constants, 'constants',
878 (a, b) => a.name.key == b.name.key, 881 (a, b) => a.name.key == b.name.key,
879 onSameElement: checkEmitterConstants); 882 onSameElement: (a, b) => checkEmitterConstants(a, b, strategy));
880 checkLists(fragment1.staticNonFinalFields, fragment2.staticNonFinalFields, 883 checkLists(fragment1.staticNonFinalFields, fragment2.staticNonFinalFields,
881 'staticNonFinalFields', (a, b) => a.name.key == b.name.key, 884 'staticNonFinalFields', (a, b) => a.name.key == b.name.key,
882 onSameElement: checkEmitterStaticFields); 885 onSameElement: checkEmitterStaticFields);
883 checkLists( 886 checkLists(
884 fragment1.staticLazilyInitializedFields, 887 fragment1.staticLazilyInitializedFields,
885 fragment2.staticLazilyInitializedFields, 888 fragment2.staticLazilyInitializedFields,
886 'staticLazilyInitializedFields', 889 'staticLazilyInitializedFields',
887 (a, b) => a.name.key == b.name.key, 890 (a, b) => a.name.key == b.name.key,
888 onSameElement: checkEmitterStaticFields); 891 onSameElement: checkEmitterStaticFields);
889 check(fragment1, fragment2, 'isMainFragment', fragment1.isMainFragment, 892 check(fragment1, fragment2, 'isMainFragment', fragment1.isMainFragment,
890 fragment2.isMainFragment); 893 fragment2.isMainFragment);
891 if (fragment1 is MainFragment && fragment2 is MainFragment) { 894 if (fragment1 is MainFragment && fragment2 is MainFragment) {
892 check(fragment1, fragment2, 'invokeMain', fragment1.invokeMain, 895 check(fragment1, fragment2, 'invokeMain', fragment1.invokeMain,
893 fragment2.invokeMain, areJsNodesEquivalent); 896 fragment2.invokeMain, areJsNodesEquivalent);
894 } 897 }
895 } 898 }
896 899
897 void checkEmitterLibraries(Library library1, Library library2) { 900 void checkEmitterLibraries(
901 Library library1, Library library2, TestStrategy strategy) {
898 check(library1, library2, 'uri', library1.uri, library2.uri); 902 check(library1, library2, 'uri', library1.uri, library2.uri);
899 checkLists(library1.classes, library2.classes, 'classes', 903 checkLists(library1.classes, library2.classes, 'classes',
900 (a, b) => a.element.name == b.element.name, 904 (a, b) => a.element.name == b.element.name,
901 onSameElement: checkEmitterClasses); 905 onSameElement: (a, b) => checkEmitterClasses(a, b, strategy));
902 checkLists(library1.statics, library2.statics, 'statics', 906 checkLists(library1.statics, library2.statics, 'statics',
903 (a, b) => a.name.key == b.name.key, 907 (a, b) => a.name.key == b.name.key,
904 onSameElement: checkEmitterMethods); 908 onSameElement: (a, b) => checkEmitterMethods(a, b, strategy));
905 checkLists( 909 checkLists(
906 library1.staticFieldsForReflection, 910 library1.staticFieldsForReflection,
907 library2.staticFieldsForReflection, 911 library2.staticFieldsForReflection,
908 'staticFieldsForReflection', 912 'staticFieldsForReflection',
909 (a, b) => a.name.key == b.name.key, 913 (a, b) => a.name.key == b.name.key,
910 onSameElement: checkEmitterFields); 914 onSameElement: checkEmitterFields);
911 } 915 }
912 916
913 void checkEmitterClasses(Class class1, Class class2) { 917 void checkEmitterClasses(Class class1, Class class2, TestStrategy strategy) {
914 checkLists(class1.methods, class2.methods, 'methods', 918 checkLists(class1.methods, class2.methods, 'methods',
915 (a, b) => a.name.key == b.name.key, 919 (a, b) => a.name.key == b.name.key,
916 onSameElement: checkEmitterMethods); 920 onSameElement: (a, b) => checkEmitterMethods(a, b, strategy));
917 checkLists(class1.fields, class2.fields, 'fields', 921 checkLists(class1.fields, class2.fields, 'fields',
918 (a, b) => a.name.key == b.name.key, 922 (a, b) => a.name.key == b.name.key,
919 onSameElement: checkEmitterFields); 923 onSameElement: checkEmitterFields);
920 checkLists(class1.isChecks, class2.isChecks, 'isChecks', 924 checkLists(class1.isChecks, class2.isChecks, 'isChecks',
921 (a, b) => a.name.key == b.name.key, 925 (a, b) => a.name.key == b.name.key,
922 onSameElement: checkEmitterMethods); 926 onSameElement: (a, b) => checkEmitterMethods(a, b, strategy));
923 checkLists(class1.checkedSetters, class2.checkedSetters, 'checkedSetters', 927 checkLists(class1.checkedSetters, class2.checkedSetters, 'checkedSetters',
924 (a, b) => a.name.key == b.name.key, 928 (a, b) => a.name.key == b.name.key,
925 onSameElement: checkEmitterMethods); 929 onSameElement: (a, b) => checkEmitterMethods(a, b, strategy));
926 checkLists(class1.callStubs, class2.callStubs, 'callStubs', 930 checkLists(class1.callStubs, class2.callStubs, 'callStubs',
927 (a, b) => a.name.key == b.name.key, 931 (a, b) => a.name.key == b.name.key,
928 onSameElement: checkEmitterMethods); 932 onSameElement: (a, b) => checkEmitterMethods(a, b, strategy));
929 checkLists(class1.noSuchMethodStubs, class2.noSuchMethodStubs, 933 checkLists(class1.noSuchMethodStubs, class2.noSuchMethodStubs,
930 'noSuchMethodStubs', (a, b) => a.name.key == b.name.key, 934 'noSuchMethodStubs', (a, b) => a.name.key == b.name.key,
931 onSameElement: checkEmitterMethods); 935 onSameElement: (a, b) => checkEmitterMethods(a, b, strategy));
932 checkLists(class1.staticFieldsForReflection, class2.staticFieldsForReflection, 936 checkLists(class1.staticFieldsForReflection, class2.staticFieldsForReflection,
933 'staticFieldsForReflection', (a, b) => a.name.key == b.name.key, 937 'staticFieldsForReflection', (a, b) => a.name.key == b.name.key,
934 onSameElement: checkEmitterFields); 938 onSameElement: checkEmitterFields);
935 939
936 check(class1, class2, 'superclassName', class1.superclassName?.key, 940 check(class1, class2, 'superclassName', class1.superclassName?.key,
937 class2.superclassName?.key); 941 class2.superclassName?.key);
938 check(class1, class2, 'isMixinApplication', class1.isMixinApplication, 942 check(class1, class2, 'isMixinApplication', class1.isMixinApplication,
939 class2.isMixinApplication); 943 class2.isMixinApplication);
940 check(class1, class2, 'hasRtiField', class1.hasRtiField, class2.hasRtiField); 944 check(class1, class2, 'hasRtiField', class1.hasRtiField, class2.hasRtiField);
941 check(class1, class2, 'onlyForRti', class1.onlyForRti, class2.onlyForRti); 945 check(class1, class2, 'onlyForRti', class1.onlyForRti, class2.onlyForRti);
942 check(class1, class2, 'isDirectlyInstantiated', class1.isDirectlyInstantiated, 946 check(class1, class2, 'isDirectlyInstantiated', class1.isDirectlyInstantiated,
943 class2.isDirectlyInstantiated); 947 class2.isDirectlyInstantiated);
944 check(class1, class2, 'isNative', class1.isNative, class2.isNative); 948 check(class1, class2, 'isNative', class1.isNative, class2.isNative);
945 check(class1, class2, 'isClosureBaseClass', class1.isClosureBaseClass, 949 check(class1, class2, 'isClosureBaseClass', class1.isClosureBaseClass,
946 class2.isClosureBaseClass); 950 class2.isClosureBaseClass);
947 check(class1, class2, 'isSoftDeferred', class1.isSoftDeferred, 951 check(class1, class2, 'isSoftDeferred', class1.isSoftDeferred,
948 class2.isSoftDeferred); 952 class2.isSoftDeferred);
949 check(class1, class2, 'isEager', class1.isEager, class2.isEager); 953 check(class1, class2, 'isEager', class1.isEager, class2.isEager);
950 checkEmitterHolders(class1.holder, class2.holder); 954 checkEmitterHolders(class1.holder, class2.holder);
951 } 955 }
952 956
953 void checkEmitterMethods(Method method1, Method method2) { 957 void checkEmitterMethods(
958 Method method1, Method method2, TestStrategy strategy) {
954 check(method1, method2, 'code', method1.code, method2.code, 959 check(method1, method2, 'code', method1.code, method2.code,
955 areJsNodesEquivalent); 960 areJsNodesEquivalent);
956 check(method1, method2, 'is ParameterStubMethod', 961 check(method1, method2, 'is ParameterStubMethod',
957 method1 is ParameterStubMethod, method2 is ParameterStubMethod); 962 method1 is ParameterStubMethod, method2 is ParameterStubMethod);
958 if (method1 is ParameterStubMethod && method2 is ParameterStubMethod) { 963 if (method1 is ParameterStubMethod && method2 is ParameterStubMethod) {
959 check(method1, method2, 'callName', method1.callName?.key, 964 check(method1, method2, 'callName', method1.callName?.key,
960 method2.callName?.key); 965 method2.callName?.key);
961 } 966 }
962 check(method1, method2, 'is DartMethod', method1 is DartMethod, 967 check(method1, method2, 'is DartMethod', method1 is DartMethod,
963 method2 is DartMethod); 968 method2 is DartMethod);
964 if (method1 is DartMethod && method2 is DartMethod) { 969 if (method1 is DartMethod && method2 is DartMethod) {
965 check(method1, method2, 'callName', method1.callName?.key, 970 check(method1, method2, 'callName', method1.callName?.key,
966 method2.callName?.key); 971 method2.callName?.key);
967 check(method1, method2, 'needsTearOff', method1.needsTearOff, 972 check(method1, method2, 'needsTearOff', method1.needsTearOff,
968 method2.needsTearOff); 973 method2.needsTearOff);
969 // TODO(johnniwinther): Fix teadOffName mismatch. 974 check(method1, method2, 'tearOffName', method1.tearOffName?.key,
970 //check(method1, method2, 'tearOffName', 975 method2.tearOffName?.key);
971 // method1.tearOffName?.key, method2.tearOffName?.key);
972 checkLists(method1.parameterStubs, method2.parameterStubs, 'parameterStubs', 976 checkLists(method1.parameterStubs, method2.parameterStubs, 'parameterStubs',
973 (a, b) => a.name.key == b.name.key, 977 (a, b) => a.name.key == b.name.key,
974 onSameElement: checkEmitterMethods); 978 onSameElement: (a, b) => checkEmitterMethods(a, b, strategy));
975 check(method1, method2, 'canBeApplied', method1.canBeApplied, 979 check(method1, method2, 'canBeApplied', method1.canBeApplied,
976 method2.canBeApplied); 980 method2.canBeApplied);
977 check(method1, method2, 'canBeReflected', method1.canBeReflected, 981 check(method1, method2, 'canBeReflected', method1.canBeReflected,
978 method2.canBeReflected); 982 method2.canBeReflected);
979 check(method1, method2, 'functionType', method1.functionType, 983 check(method1, method2, 'functionType', method1.functionType,
980 method2.functionType, areJsNodesEquivalent); 984 method2.functionType, areJsNodesEquivalent);
981 check(method1, method2, 'requiredParameterCount', 985 check(method1, method2, 'requiredParameterCount',
982 method1.requiredParameterCount, method2.requiredParameterCount); 986 method1.requiredParameterCount, method2.requiredParameterCount);
983 // TODO(johnniwinther): Check optionalParameterDefaultValues. 987 if (method1.optionalParameterDefaultValues == null &&
988 method2.optionalParameterDefaultValues == null) {
989 // Nothing to test.
990 } else if (method1.optionalParameterDefaultValues is List &&
991 method2.optionalParameterDefaultValues is List) {
992 checkLists(
993 method1.optionalParameterDefaultValues,
994 method2.optionalParameterDefaultValues,
995 'optionalParameterDefaultValues',
996 strategy.constantValueEquivalence);
997 } else if (method1.optionalParameterDefaultValues is Map &&
998 method2.optionalParameterDefaultValues is Map) {
999 checkMaps(
1000 method1.optionalParameterDefaultValues,
1001 method2.optionalParameterDefaultValues,
1002 'optionalParameterDefaultValues',
1003 equality,
1004 strategy.constantValueEquivalence);
1005 } else {
1006 check(
1007 method1,
1008 method2,
1009 'optionalParameterDefaultValues',
1010 method1.optionalParameterDefaultValues,
1011 method2.optionalParameterDefaultValues);
1012 }
984 } 1013 }
985 } 1014 }
986 1015
987 void checkEmitterFields(Field field1, Field field2) { 1016 void checkEmitterFields(Field field1, Field field2) {
988 check(field1, field2, 'accessorName', field1.accessorName?.key, 1017 check(field1, field2, 'accessorName', field1.accessorName?.key,
989 field2.accessorName?.key); 1018 field2.accessorName?.key);
990 check(field1, field2, 'getterFlags', field1.getterFlags, field2.getterFlags); 1019 check(field1, field2, 'getterFlags', field1.getterFlags, field2.getterFlags);
991 check(field1, field2, 'setterFlags', field1.setterFlags, field2.setterFlags); 1020 check(field1, field2, 'setterFlags', field1.setterFlags, field2.setterFlags);
992 check(field1, field2, 'needsCheckedSetter', field1.needsCheckedSetter, 1021 check(field1, field2, 'needsCheckedSetter', field1.needsCheckedSetter,
993 field2.needsCheckedSetter); 1022 field2.needsCheckedSetter);
994 } 1023 }
995 1024
996 void checkEmitterConstants(Constant constant1, Constant constant2) { 1025 void checkEmitterConstants(
997 // TODO(johnniwinther): Check value. 1026 Constant constant1, Constant constant2, TestStrategy strategy) {
998 checkEmitterHolders(constant1.holder, constant2.holder); 1027 checkEmitterHolders(constant1.holder, constant2.holder);
1028 check(constant1, constant2, 'value', constant1.value, constant2.value,
1029 strategy.constantValueEquivalence);
999 } 1030 }
1000 1031
1001 void checkEmitterStaticFields(StaticField field1, StaticField field2) { 1032 void checkEmitterStaticFields(StaticField field1, StaticField field2) {
1002 check(field1, field2, 'code', field1.code, field2.code, areJsNodesEquivalent); 1033 check(field1, field2, 'code', field1.code, field2.code, areJsNodesEquivalent);
1003 check(field1, field2, 'isFinal', field1.isFinal, field2.isFinal); 1034 check(field1, field2, 'isFinal', field1.isFinal, field2.isFinal);
1004 check(field1, field2, 'isLazy', field1.isLazy, field2.isLazy); 1035 check(field1, field2, 'isLazy', field1.isLazy, field2.isLazy);
1005 checkEmitterHolders(field1.holder, field2.holder); 1036 checkEmitterHolders(field1.holder, field2.holder);
1006 } 1037 }
1007 1038
1008 void checkEmitterHolders(Holder holder1, Holder holder2) { 1039 void checkEmitterHolders(Holder holder1, Holder holder2) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1063 print(' ${js.nodeToString(node1)}'); 1094 print(' ${js.nodeToString(node1)}');
1064 print(' ${js.nodeToString(node2)}'); 1095 print(' ${js.nodeToString(node2)}');
1065 } 1096 }
1066 return expectedValue == label2; 1097 return expectedValue == label2;
1067 } else { 1098 } else {
1068 labelsMap[label1] = label2; 1099 labelsMap[label1] = label2;
1069 return true; 1100 return true;
1070 } 1101 }
1071 } 1102 }
1072 } 1103 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698