OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/typing-asm.h" | 7 #include "src/typing-asm.h" |
8 | 8 |
9 #include "src/ast.h" | 9 #include "src/ast.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 UNREACHABLE(); | 787 UNREACHABLE(); |
788 } | 788 } |
789 } | 789 } |
790 | 790 |
791 | 791 |
792 void AsmTyper::VisitCountOperation(CountOperation* expr) { | 792 void AsmTyper::VisitCountOperation(CountOperation* expr) { |
793 FAIL(expr, "increment or decrement operator encountered"); | 793 FAIL(expr, "increment or decrement operator encountered"); |
794 } | 794 } |
795 | 795 |
796 | 796 |
| 797 void AsmTyper::VisitIntegerBinaryOperation(BinaryOperation* expr, |
| 798 Type* expected_type, |
| 799 Type* result_type) { |
| 800 RECURSE(VisitWithExpectation(expr->left(), expected_type, |
| 801 "left bit operand expected to be integer")); |
| 802 int left_intish = intish_; |
| 803 RECURSE(VisitWithExpectation(expr->right(), expected_type, |
| 804 "right bit operand expected to be integer")); |
| 805 int right_intish = intish_; |
| 806 if (left_intish > kMaxUncombinedAdditiveSteps) { |
| 807 FAIL(expr, "too many consecutive additive ops"); |
| 808 } |
| 809 if (right_intish > kMaxUncombinedAdditiveSteps) { |
| 810 FAIL(expr, "too many consecutive additive ops"); |
| 811 } |
| 812 intish_ = 0; |
| 813 IntersectResult(expr, result_type); |
| 814 } |
| 815 |
| 816 |
797 void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { | 817 void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
798 switch (expr->op()) { | 818 switch (expr->op()) { |
799 case Token::COMMA: { | 819 case Token::COMMA: { |
800 RECURSE(VisitWithExpectation(expr->left(), Type::Any(), | 820 RECURSE(VisitWithExpectation(expr->left(), Type::Any(), |
801 "left comma operand expected to be any")); | 821 "left comma operand expected to be any")); |
802 RECURSE(VisitWithExpectation(expr->right(), Type::Any(), | 822 RECURSE(VisitWithExpectation(expr->right(), Type::Any(), |
803 "right comma operand expected to be any")); | 823 "right comma operand expected to be any")); |
804 IntersectResult(expr, computed_type_); | 824 IntersectResult(expr, computed_type_); |
805 return; | 825 return; |
806 } | 826 } |
807 case Token::OR: | 827 case Token::OR: |
808 case Token::AND: | 828 case Token::AND: |
809 FAIL(expr, "logical operator encountered"); | 829 FAIL(expr, "logical operator encountered"); |
810 case Token::BIT_OR: | 830 case Token::BIT_OR: { |
811 case Token::BIT_AND: | 831 // BIT_OR allows Any since it is used as a type coercion. |
812 case Token::BIT_XOR: | 832 VisitIntegerBinaryOperation(expr, Type::Any(), cache_.kInt32); |
| 833 return; |
| 834 } |
| 835 case Token::BIT_XOR: { |
| 836 // BIT_XOR allows Number since it is used as a type coercion (encoding ~). |
| 837 VisitIntegerBinaryOperation(expr, Type::Number(), cache_.kInt32); |
| 838 return; |
| 839 } |
| 840 case Token::SHR: { |
| 841 VisitIntegerBinaryOperation(expr, Type::Number(), cache_.kUint32); |
| 842 return; |
| 843 } |
813 case Token::SHL: | 844 case Token::SHL: |
814 case Token::SHR: | 845 case Token::SAR: |
815 case Token::SAR: { | 846 case Token::BIT_AND: { |
816 // BIT_OR allows Any since it is used as a type coercion. | 847 VisitIntegerBinaryOperation(expr, cache_.kInt32, cache_.kInt32); |
817 // BIT_XOR allows Number since it is used as a type coercion (encoding ~). | |
818 Type* expectation = | |
819 expr->op() == Token::BIT_OR | |
820 ? Type::Any() | |
821 : expr->op() == Token::BIT_XOR ? Type::Number() : cache_.kInt32; | |
822 Type* result = | |
823 expr->op() == Token::SHR ? Type::Unsigned32() : cache_.kInt32; | |
824 RECURSE(VisitWithExpectation(expr->left(), expectation, | |
825 "left bit operand expected to be integer")); | |
826 int left_intish = intish_; | |
827 RECURSE(VisitWithExpectation(expr->right(), expectation, | |
828 "right bit operand expected to be integer")); | |
829 int right_intish = intish_; | |
830 if (left_intish > kMaxUncombinedAdditiveSteps) { | |
831 FAIL(expr, "too many consecutive additive ops"); | |
832 } | |
833 if (right_intish > kMaxUncombinedAdditiveSteps) { | |
834 FAIL(expr, "too many consecutive additive ops"); | |
835 } | |
836 intish_ = 0; | |
837 IntersectResult(expr, result); | |
838 return; | 848 return; |
839 } | 849 } |
840 case Token::ADD: | 850 case Token::ADD: |
841 case Token::SUB: | 851 case Token::SUB: |
842 case Token::MUL: | 852 case Token::MUL: |
843 case Token::DIV: | 853 case Token::DIV: |
844 case Token::MOD: { | 854 case Token::MOD: { |
845 RECURSE(VisitWithExpectation( | 855 RECURSE(VisitWithExpectation( |
846 expr->left(), Type::Number(), | 856 expr->left(), Type::Number(), |
847 "left arithmetic operand expected to be number")); | 857 "left arithmetic operand expected to be number")); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 RECURSE( | 902 RECURSE( |
893 VisitWithExpectation(expr->left(), Type::Number(), | 903 VisitWithExpectation(expr->left(), Type::Number(), |
894 "left comparison operand expected to be number")); | 904 "left comparison operand expected to be number")); |
895 Type* left_type = computed_type_; | 905 Type* left_type = computed_type_; |
896 RECURSE( | 906 RECURSE( |
897 VisitWithExpectation(expr->right(), Type::Number(), | 907 VisitWithExpectation(expr->right(), Type::Number(), |
898 "right comparison operand expected to be number")); | 908 "right comparison operand expected to be number")); |
899 Type* right_type = computed_type_; | 909 Type* right_type = computed_type_; |
900 Type* type = Type::Union(left_type, right_type, zone()); | 910 Type* type = Type::Union(left_type, right_type, zone()); |
901 expr->set_combined_type(type); | 911 expr->set_combined_type(type); |
902 if (type->Is(Type::Integral32()) || type->Is(Type::UntaggedFloat64())) { | 912 if (type->Is(cache_.kInt32) || type->Is(cache_.kUint32) || |
| 913 type->Is(cache_.kFloat32) || type->Is(cache_.kFloat64)) { |
903 IntersectResult(expr, cache_.kInt32); | 914 IntersectResult(expr, cache_.kInt32); |
904 } else { | 915 } else { |
905 FAIL(expr, "ill-typed comparison operation"); | 916 FAIL(expr, "ill-typed comparison operation"); |
906 } | 917 } |
907 } | 918 } |
908 | 919 |
909 | 920 |
910 void AsmTyper::VisitThisFunction(ThisFunction* expr) { | 921 void AsmTyper::VisitThisFunction(ThisFunction* expr) { |
911 FAIL(expr, "this function not allowed"); | 922 FAIL(expr, "this function not allowed"); |
912 } | 923 } |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 computed_type_->Print(); | 1078 computed_type_->Print(); |
1068 PrintF("Expected type: "); | 1079 PrintF("Expected type: "); |
1069 expected_type_->Print(); | 1080 expected_type_->Print(); |
1070 #endif | 1081 #endif |
1071 FAIL(expr, msg); | 1082 FAIL(expr, msg); |
1072 } | 1083 } |
1073 expected_type_ = save; | 1084 expected_type_ = save; |
1074 } | 1085 } |
1075 } // namespace internal | 1086 } // namespace internal |
1076 } // namespace v8 | 1087 } // namespace v8 |
OLD | NEW |