Changeset 180813 in webkit for trunk/Source/JavaScriptCore/parser/ASTBuilder.h
- Timestamp:
- Feb 27, 2015, 7:21:37 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/parser/ASTBuilder.h
r180518 r180813 193 193 return new (m_parserArena) ArrayNode(location, elisions, elems); 194 194 } 195 ExpressionNode* create NumberExpr(const JSTokenLocation& location, double d)195 ExpressionNode* createDoubleExpr(const JSTokenLocation& location, double d) 196 196 { 197 197 incConstants(); 198 return new (m_parserArena) NumberNode(location, d); 198 return new (m_parserArena) DoubleNode(location, d); 199 } 200 ExpressionNode* createIntegerExpr(const JSTokenLocation& location, double d) 201 { 202 incConstants(); 203 return new (m_parserArena) IntegerNode(location, d); 199 204 } 200 205 … … 749 754 m_scope.m_features |= EvalFeature; 750 755 } 751 ExpressionNode* createNumber(const JSTokenLocation& location, double d) 752 { 753 return new (m_parserArena) NumberNode(location, d); 754 } 755 756 ExpressionNode* createIntegerLikeNumber(const JSTokenLocation& location, double d) 757 { 758 return new (m_parserArena) IntegerNode(location, d); 759 } 760 ExpressionNode* createDoubleLikeNumber(const JSTokenLocation& location, double d) 761 { 762 return new (m_parserArena) DoubleNode(location, d); 763 } 764 ExpressionNode* createNumberFromBinaryOperation(const JSTokenLocation& location, double value, const NumberNode& originalNodeA, const NumberNode& originalNodeB) 765 { 766 if (originalNodeA.isIntegerNode() && originalNodeB.isIntegerNode()) 767 return createIntegerLikeNumber(location, value); 768 return createDoubleLikeNumber(location, value); 769 } 770 ExpressionNode* createNumberFromUnaryOperation(const JSTokenLocation& location, double value, const NumberNode& originalNode) 771 { 772 if (originalNode.isIntegerNode()) 773 return createIntegerLikeNumber(location, value); 774 return createDoubleLikeNumber(location, value); 775 } 776 756 777 VM* m_vm; 757 778 ParserArena& m_parserArena; … … 794 815 { 795 816 if (n->isNumber()) { 796 NumberNode* numberNode = static_cast<NumberNode*>(n); 797 numberNode->setValue(-numberNode->value()); 798 return numberNode; 817 const NumberNode& numberNode = static_cast<const NumberNode&>(*n); 818 return createNumberFromUnaryOperation(location, -numberNode.value(), numberNode); 799 819 } 800 820 … … 805 825 { 806 826 if (expr->isNumber()) 807 return create Number(location, ~toInt32(static_cast<NumberNode*>(expr)->value()));827 return createIntegerLikeNumber(location, ~toInt32(static_cast<NumberNode*>(expr)->value())); 808 828 return new (m_parserArena) BitwiseNotNode(location, expr); 809 829 } … … 814 834 expr2 = expr2->stripUnaryPlus(); 815 835 816 if (expr1->isNumber() && expr2->isNumber()) 817 return createNumber(location, static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value()); 836 if (expr1->isNumber() && expr2->isNumber()) { 837 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 838 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 839 return createNumberFromBinaryOperation(location, numberExpr1.value() * numberExpr2.value(), numberExpr1, numberExpr2); 840 } 818 841 819 842 if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1) … … 831 854 expr2 = expr2->stripUnaryPlus(); 832 855 833 if (expr1->isNumber() && expr2->isNumber()) 834 return createNumber(location, static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value()); 856 if (expr1->isNumber() && expr2->isNumber()) { 857 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 858 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 859 double result = numberExpr1.value() / numberExpr2.value(); 860 if (static_cast<int64_t>(result) == result) 861 return createNumberFromBinaryOperation(location, result, numberExpr1, numberExpr2); 862 return createDoubleLikeNumber(location, result); 863 } 835 864 return new (m_parserArena) DivNode(location, expr1, expr2, rightHasAssignments); 836 865 } … … 840 869 expr1 = expr1->stripUnaryPlus(); 841 870 expr2 = expr2->stripUnaryPlus(); 842 843 if (expr1->isNumber() && expr2->isNumber()) 844 return createNumber(location, fmod(static_cast<NumberNode*>(expr1)->value(), static_cast<NumberNode*>(expr2)->value())); 871 872 if (expr1->isNumber() && expr2->isNumber()) { 873 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 874 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 875 return createIntegerLikeNumber(location, fmod(numberExpr1.value(), numberExpr2.value())); 876 } 845 877 return new (m_parserArena) ModNode(location, expr1, expr2, rightHasAssignments); 846 878 } … … 848 880 ExpressionNode* ASTBuilder::makeAddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 849 881 { 850 if (expr1->isNumber() && expr2->isNumber()) 851 return createNumber(location, static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value()); 882 883 if (expr1->isNumber() && expr2->isNumber()) { 884 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 885 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 886 return createNumberFromBinaryOperation(location, numberExpr1.value() + numberExpr2.value(), numberExpr1, numberExpr2); 887 } 852 888 return new (m_parserArena) AddNode(location, expr1, expr2, rightHasAssignments); 853 889 } … … 858 894 expr2 = expr2->stripUnaryPlus(); 859 895 860 if (expr1->isNumber() && expr2->isNumber()) 861 return createNumber(location, static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value()); 896 if (expr1->isNumber() && expr2->isNumber()) { 897 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 898 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 899 return createNumberFromBinaryOperation(location, numberExpr1.value() - numberExpr2.value(), numberExpr1, numberExpr2); 900 } 862 901 return new (m_parserArena) SubNode(location, expr1, expr2, rightHasAssignments); 863 902 } … … 865 904 ExpressionNode* ASTBuilder::makeLeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 866 905 { 867 if (expr1->isNumber() && expr2->isNumber()) 868 return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 906 if (expr1->isNumber() && expr2->isNumber()) { 907 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 908 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 909 return createIntegerLikeNumber(location, toInt32(numberExpr1.value()) << (toUInt32(numberExpr2.value()) & 0x1f)); 910 } 869 911 return new (m_parserArena) LeftShiftNode(location, expr1, expr2, rightHasAssignments); 870 912 } … … 872 914 ExpressionNode* ASTBuilder::makeRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 873 915 { 874 if (expr1->isNumber() && expr2->isNumber()) 875 return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 916 if (expr1->isNumber() && expr2->isNumber()) { 917 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 918 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 919 return createIntegerLikeNumber(location, toInt32(numberExpr1.value()) >> (toUInt32(numberExpr2.value()) & 0x1f)); 920 } 876 921 return new (m_parserArena) RightShiftNode(location, expr1, expr2, rightHasAssignments); 877 922 } … … 879 924 ExpressionNode* ASTBuilder::makeURightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 880 925 { 881 if (expr1->isNumber() && expr2->isNumber()) 882 return createNumber(location, toUInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 926 if (expr1->isNumber() && expr2->isNumber()) { 927 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 928 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 929 return createIntegerLikeNumber(location, toUInt32(numberExpr1.value()) >> (toUInt32(numberExpr2.value()) & 0x1f)); 930 } 883 931 return new (m_parserArena) UnsignedRightShiftNode(location, expr1, expr2, rightHasAssignments); 884 932 } … … 886 934 ExpressionNode* ASTBuilder::makeBitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 887 935 { 888 if (expr1->isNumber() && expr2->isNumber()) 889 return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) | toInt32(static_cast<NumberNode*>(expr2)->value())); 936 if (expr1->isNumber() && expr2->isNumber()) { 937 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 938 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 939 return createIntegerLikeNumber(location, toInt32(numberExpr1.value()) | toInt32(numberExpr2.value())); 940 } 890 941 return new (m_parserArena) BitOrNode(location, expr1, expr2, rightHasAssignments); 891 942 } … … 893 944 ExpressionNode* ASTBuilder::makeBitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 894 945 { 895 if (expr1->isNumber() && expr2->isNumber()) 896 return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) & toInt32(static_cast<NumberNode*>(expr2)->value())); 946 if (expr1->isNumber() && expr2->isNumber()) { 947 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 948 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 949 return createIntegerLikeNumber(location, toInt32(numberExpr1.value()) & toInt32(numberExpr2.value())); 950 } 897 951 return new (m_parserArena) BitAndNode(location, expr1, expr2, rightHasAssignments); 898 952 } … … 900 954 ExpressionNode* ASTBuilder::makeBitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 901 955 { 902 if (expr1->isNumber() && expr2->isNumber()) 903 return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) ^ toInt32(static_cast<NumberNode*>(expr2)->value())); 956 if (expr1->isNumber() && expr2->isNumber()) { 957 const NumberNode& numberExpr1 = static_cast<NumberNode&>(*expr1); 958 const NumberNode& numberExpr2 = static_cast<NumberNode&>(*expr2); 959 return createIntegerLikeNumber(location, toInt32(numberExpr1.value()) ^ toInt32(numberExpr2.value())); 960 } 904 961 return new (m_parserArena) BitXOrNode(location, expr1, expr2, rightHasAssignments); 905 962 }
Note:
See TracChangeset
for help on using the changeset viewer.