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/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include <stack> | 7 #include <stack> |
8 | 8 |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/interpreter/control-flow-builders.h" | 10 #include "src/interpreter/control-flow-builders.h" |
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
833 | 833 |
834 | 834 |
835 void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { | 835 void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { |
836 UNIMPLEMENTED(); | 836 UNIMPLEMENTED(); |
837 } | 837 } |
838 | 838 |
839 | 839 |
840 void BytecodeGenerator::VisitBinaryOperation(BinaryOperation* binop) { | 840 void BytecodeGenerator::VisitBinaryOperation(BinaryOperation* binop) { |
841 switch (binop->op()) { | 841 switch (binop->op()) { |
842 case Token::COMMA: | 842 case Token::COMMA: |
| 843 VisitCommaExpression(binop); |
| 844 break; |
843 case Token::OR: | 845 case Token::OR: |
| 846 VisitLogicalOrExpression(binop); |
| 847 break; |
844 case Token::AND: | 848 case Token::AND: |
845 UNIMPLEMENTED(); | 849 VisitLogicalAndExpression(binop); |
846 break; | 850 break; |
847 default: | 851 default: |
848 VisitArithmeticExpression(binop); | 852 VisitArithmeticExpression(binop); |
849 break; | 853 break; |
850 } | 854 } |
851 } | 855 } |
852 | 856 |
853 | 857 |
854 void BytecodeGenerator::VisitCompareOperation(CompareOperation* expr) { | 858 void BytecodeGenerator::VisitCompareOperation(CompareOperation* expr) { |
855 Token::Value op = expr->op(); | 859 Token::Value op = expr->op(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 TemporaryRegisterScope temporary_register_scope(builder()); | 937 TemporaryRegisterScope temporary_register_scope(builder()); |
934 Register temporary = temporary_register_scope.NewRegister(); | 938 Register temporary = temporary_register_scope.NewRegister(); |
935 | 939 |
936 Visit(left); | 940 Visit(left); |
937 builder()->StoreAccumulatorInRegister(temporary); | 941 builder()->StoreAccumulatorInRegister(temporary); |
938 Visit(right); | 942 Visit(right); |
939 builder()->BinaryOperation(op, temporary, language_mode_strength()); | 943 builder()->BinaryOperation(op, temporary, language_mode_strength()); |
940 } | 944 } |
941 | 945 |
942 | 946 |
| 947 void BytecodeGenerator::VisitCommaExpression(BinaryOperation* binop) { |
| 948 Expression* left = binop->left(); |
| 949 Expression* right = binop->right(); |
| 950 |
| 951 Visit(left); |
| 952 Visit(right); |
| 953 } |
| 954 |
| 955 |
| 956 void BytecodeGenerator::VisitLogicalOrExpression(BinaryOperation* binop) { |
| 957 Expression* left = binop->left(); |
| 958 Expression* right = binop->right(); |
| 959 |
| 960 // Short-circuit evaluation- If it is known that left is always true, |
| 961 // no need to visit right |
| 962 if (left->ToBooleanIsTrue()) { |
| 963 Visit(left); |
| 964 } else { |
| 965 BytecodeLabel end_label; |
| 966 |
| 967 Visit(left); |
| 968 builder()->JumpIfToBooleanTrue(&end_label); |
| 969 Visit(right); |
| 970 builder()->Bind(&end_label); |
| 971 } |
| 972 } |
| 973 |
| 974 |
| 975 void BytecodeGenerator::VisitLogicalAndExpression(BinaryOperation* binop) { |
| 976 Expression* left = binop->left(); |
| 977 Expression* right = binop->right(); |
| 978 |
| 979 // Short-circuit evaluation- If it is known that left is always false, |
| 980 // no need to visit right |
| 981 if (left->ToBooleanIsFalse()) { |
| 982 Visit(left); |
| 983 } else { |
| 984 BytecodeLabel end_label; |
| 985 |
| 986 Visit(left); |
| 987 builder()->JumpIfToBooleanFalse(&end_label); |
| 988 Visit(right); |
| 989 builder()->Bind(&end_label); |
| 990 } |
| 991 } |
| 992 |
| 993 |
943 LanguageMode BytecodeGenerator::language_mode() const { | 994 LanguageMode BytecodeGenerator::language_mode() const { |
944 return info()->language_mode(); | 995 return info()->language_mode(); |
945 } | 996 } |
946 | 997 |
947 | 998 |
948 Strength BytecodeGenerator::language_mode_strength() const { | 999 Strength BytecodeGenerator::language_mode_strength() const { |
949 return strength(language_mode()); | 1000 return strength(language_mode()); |
950 } | 1001 } |
951 | 1002 |
952 | 1003 |
953 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 1004 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
954 return info()->feedback_vector()->GetIndex(slot); | 1005 return info()->feedback_vector()->GetIndex(slot); |
955 } | 1006 } |
956 | 1007 |
957 } // namespace interpreter | 1008 } // namespace interpreter |
958 } // namespace internal | 1009 } // namespace internal |
959 } // namespace v8 | 1010 } // namespace v8 |
OLD | NEW |