OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 /// Functions for asserting equivalence across serialization. | 5 /// Functions for asserting equivalence across serialization. |
6 | 6 |
7 library dart2js.serialization.equivalence; | 7 library dart2js.serialization.equivalence; |
8 | 8 |
9 import '../common/resolution.dart'; | 9 import '../common/resolution.dart'; |
10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
11 import '../dart_types.dart'; | 11 import '../dart_types.dart'; |
12 import '../elements/elements.dart'; | 12 import '../elements/elements.dart'; |
13 import '../elements/visitor.dart'; | 13 import '../elements/visitor.dart'; |
| 14 import '../js_backend/backend_serialization.dart' |
| 15 show JavaScriptBackendSerializer; |
| 16 import '../native/native.dart' show NativeBehavior; |
14 import '../resolution/access_semantics.dart'; | 17 import '../resolution/access_semantics.dart'; |
15 import '../resolution/send_structure.dart'; | 18 import '../resolution/send_structure.dart'; |
16 import '../resolution/tree_elements.dart'; | 19 import '../resolution/tree_elements.dart'; |
17 import '../tokens/token.dart'; | 20 import '../tokens/token.dart'; |
18 import '../tree/nodes.dart'; | 21 import '../tree/nodes.dart'; |
19 import '../universe/selector.dart'; | 22 import '../universe/selector.dart'; |
20 import '../universe/use.dart'; | 23 import '../universe/use.dart'; |
21 import '../util/util.dart'; | 24 import '../util/util.dart'; |
22 import 'resolved_ast_serialization.dart'; | 25 import 'resolved_ast_serialization.dart'; |
23 | 26 |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 indices2.nodeIndices[b.label]) && | 824 indices2.nodeIndices[b.label]) && |
822 strategy.test(a, b, 'labelName', a.labelName, b.labelName) && | 825 strategy.test(a, b, 'labelName', a.labelName, b.labelName) && |
823 strategy.test(a, b, 'target', indices1.nodeIndices[a.target.statement], | 826 strategy.test(a, b, 'target', indices1.nodeIndices[a.target.statement], |
824 indices2.nodeIndices[b.target.statement]) && | 827 indices2.nodeIndices[b.target.statement]) && |
825 strategy.test( | 828 strategy.test( |
826 a, b, 'isBreakTarget', a.isBreakTarget, b.isBreakTarget) && | 829 a, b, 'isBreakTarget', a.isBreakTarget, b.isBreakTarget) && |
827 strategy.test( | 830 strategy.test( |
828 a, b, 'isContinueTarget', a.isContinueTarget, b.isContinueTarget); | 831 a, b, 'isContinueTarget', a.isContinueTarget, b.isContinueTarget); |
829 } | 832 } |
830 | 833 |
| 834 bool testNativeData(Node node1, Node node2, String property, a, b) { |
| 835 if (identical(a, b)) return true; |
| 836 if (a == null || b == null) return false; |
| 837 if (a is NativeBehavior && b is NativeBehavior) { |
| 838 return strategy.test(a, b, 'codeTemplateText', a.codeTemplateText, |
| 839 b.codeTemplateText) && |
| 840 strategy.test(a, b, 'isAllocation', a.isAllocation, b.isAllocation) && |
| 841 strategy.test(a, b, 'sideEffects', a.sideEffects, b.sideEffects) && |
| 842 strategy.test( |
| 843 a, b, 'throwBehavior', a.throwBehavior, b.throwBehavior) && |
| 844 strategy.testTypeLists( |
| 845 a, |
| 846 b, |
| 847 'dartTypesReturned', |
| 848 JavaScriptBackendSerializer.filterDartTypes(a.typesReturned), |
| 849 JavaScriptBackendSerializer.filterDartTypes(b.typesReturned)) && |
| 850 strategy.testLists( |
| 851 a, |
| 852 b, |
| 853 'specialTypesReturned', |
| 854 JavaScriptBackendSerializer.filterSpecialTypes(a.typesReturned), |
| 855 JavaScriptBackendSerializer |
| 856 .filterSpecialTypes(b.typesReturned)) && |
| 857 strategy.testTypeLists( |
| 858 a, |
| 859 b, |
| 860 'dartTypesInstantiated', |
| 861 JavaScriptBackendSerializer.filterDartTypes(a.typesInstantiated), |
| 862 JavaScriptBackendSerializer |
| 863 .filterDartTypes(b.typesInstantiated)) && |
| 864 strategy.testLists( |
| 865 a, |
| 866 b, |
| 867 'specialTypesInstantiated', |
| 868 JavaScriptBackendSerializer |
| 869 .filterSpecialTypes(a.typesInstantiated), |
| 870 JavaScriptBackendSerializer |
| 871 .filterSpecialTypes(b.typesInstantiated)) && |
| 872 strategy.test(a, b, 'useGvn', a.useGvn, b.useGvn); |
| 873 } |
| 874 return true; |
| 875 } |
| 876 |
831 visitNode(Node node1) { | 877 visitNode(Node node1) { |
832 if (!success) return; | 878 if (!success) return; |
833 int index = indices1.nodeIndices[node1]; | 879 int index = indices1.nodeIndices[node1]; |
834 Node node2 = indices2.nodeList[index]; | 880 Node node2 = indices2.nodeList[index]; |
835 success = strategy.testElements( | 881 success = strategy.testElements( |
836 node1, node2, '[$index]', elements1[node1], elements2[node2]) && | 882 node1, node2, '[$index]', elements1[node1], elements2[node2]) && |
837 strategy.testTypes(node1, node2, 'getType($index)', | 883 strategy.testTypes(node1, node2, 'getType($index)', |
838 elements1.getType(node1), elements2.getType(node2)) && | 884 elements1.getType(node1), elements2.getType(node2)) && |
839 strategy.test( | 885 strategy.test( |
840 node1, | 886 node1, |
841 node2, | 887 node2, |
842 'getSelector($index)', | 888 'getSelector($index)', |
843 elements1.getSelector(node1), | 889 elements1.getSelector(node1), |
844 elements2.getSelector(node2), | 890 elements2.getSelector(node2), |
845 areSelectorsEquivalent) && | 891 areSelectorsEquivalent) && |
846 strategy.testConstants(node1, node2, 'getConstant($index)', | 892 strategy.testConstants(node1, node2, 'getConstant($index)', |
847 elements1.getConstant(node1), elements2.getConstant(node2)) && | 893 elements1.getConstant(node1), elements2.getConstant(node2)) && |
848 strategy.testTypes(node1, node2, 'typesCache[$index]', | 894 strategy.testTypes(node1, node2, 'typesCache[$index]', |
849 elements1.typesCache[node1], elements2.typesCache[node2]) && | 895 elements1.typesCache[node1], elements2.typesCache[node2]) && |
850 testJumpTargets( | 896 testJumpTargets( |
851 node1, | 897 node1, |
852 node2, | 898 node2, |
853 'getTargetDefinition($index)', | 899 'getTargetDefinition($index)', |
854 elements1.getTargetDefinition(node1), | 900 elements1.getTargetDefinition(node1), |
855 elements2.getTargetDefinition(node2)); | 901 elements2.getTargetDefinition(node2)) && |
| 902 testNativeData(node1, node2, 'getNativeData($index)', |
| 903 elements1.getNativeData(node1), elements2.getNativeData(node2)); |
856 | 904 |
857 node1.visitChildren(this); | 905 node1.visitChildren(this); |
858 } | 906 } |
859 | 907 |
860 @override | 908 @override |
861 visitSend(Send node1) { | 909 visitSend(Send node1) { |
862 visitExpression(node1); | 910 visitExpression(node1); |
863 if (!success) return; | 911 if (!success) return; |
864 int index = indices1.nodeIndices[node1]; | 912 int index = indices1.nodeIndices[node1]; |
865 Send node2 = indices2.nodeList[index]; | 913 Send node2 = indices2.nodeList[index]; |
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 @override | 1737 @override |
1690 bool visitStatement(Statement node1, Statement node2) { | 1738 bool visitStatement(Statement node1, Statement node2) { |
1691 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2'); | 1739 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2'); |
1692 } | 1740 } |
1693 | 1741 |
1694 @override | 1742 @override |
1695 bool visitStringNode(StringNode node1, StringNode node2) { | 1743 bool visitStringNode(StringNode node1, StringNode node2) { |
1696 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2'); | 1744 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2'); |
1697 } | 1745 } |
1698 } | 1746 } |
OLD | NEW |