Changeset 27747 in webkit for trunk/JavaScriptCore
- Timestamp:
- Nov 13, 2007, 12:02:44 AM (18 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r27746 r27747 1 2007-11-12 Eric Seidel <[email protected]> 2 3 Reviewed by Oliver. 4 5 Add evaluateToInt32 and evaluateUInt32 methods and deploy them. 6 Fix a few missing evaluateToBoolean methods 7 Deploy all evaluateTo* functions to more nodes to avoid slowdowns 8 http://bugs.webkit.org/show_bug.cgi?id=15950 9 10 SunSpider claims this is at least a 1.4% speedup. 11 12 * kjs/JSImmediate.h: 13 (KJS::JSImmediate::getTruncatedInt32): 14 (KJS::JSImmediate::toDouble): 15 (KJS::JSImmediate::getUInt32): 16 * kjs/nodes.cpp: 17 (KJS::ExpressionNode::evaluateToNumber): 18 (KJS::ExpressionNode::evaluateToInt32): 19 (KJS::ExpressionNode::evaluateToUInt32): 20 (KJS::NumberNode::evaluateToInt32): 21 (KJS::NumberNode::evaluateToUInt32): 22 (KJS::ImmediateNumberNode::evaluateToInt32): 23 (KJS::ImmediateNumberNode::evaluateToUInt32): 24 (KJS::ResolveNode::evaluate): 25 (KJS::ResolveNode::evaluateToNumber): 26 (KJS::ResolveNode::evaluateToBoolean): 27 (KJS::ResolveNode::evaluateToInt32): 28 (KJS::ResolveNode::evaluateToUInt32): 29 (KJS::LocalVarAccessNode::evaluateToInt32): 30 (KJS::LocalVarAccessNode::evaluateToUInt32): 31 (KJS::BracketAccessorNode::evaluateToNumber): 32 (KJS::BracketAccessorNode::evaluateToBoolean): 33 (KJS::BracketAccessorNode::evaluateToInt32): 34 (KJS::BracketAccessorNode::evaluateToUInt32): 35 (KJS::DotAccessorNode::inlineEvaluate): 36 (KJS::DotAccessorNode::evaluate): 37 (KJS::DotAccessorNode::evaluateToNumber): 38 (KJS::DotAccessorNode::evaluateToBoolean): 39 (KJS::DotAccessorNode::evaluateToInt32): 40 (KJS::DotAccessorNode::evaluateToUInt32): 41 (KJS::NewExprNode::inlineEvaluate): 42 (KJS::NewExprNode::evaluate): 43 (KJS::NewExprNode::evaluateToNumber): 44 (KJS::NewExprNode::evaluateToBoolean): 45 (KJS::NewExprNode::evaluateToInt32): 46 (KJS::NewExprNode::evaluateToUInt32): 47 (KJS::FunctionCallResolveNode::inlineEvaluate): 48 (KJS::FunctionCallResolveNode::evaluate): 49 (KJS::FunctionCallResolveNode::evaluateToNumber): 50 (KJS::FunctionCallResolveNode::evaluateToBoolean): 51 (KJS::FunctionCallResolveNode::evaluateToInt32): 52 (KJS::FunctionCallResolveNode::evaluateToUInt32): 53 (KJS::LocalVarFunctionCallNode::evaluate): 54 (KJS::LocalVarFunctionCallNode::evaluateToNumber): 55 (KJS::LocalVarFunctionCallNode::evaluateToBoolean): 56 (KJS::LocalVarFunctionCallNode::evaluateToInt32): 57 (KJS::LocalVarFunctionCallNode::evaluateToUInt32): 58 (KJS::FunctionCallDotNode::evaluate): 59 (KJS::FunctionCallDotNode::evaluateToNumber): 60 (KJS::FunctionCallDotNode::evaluateToBoolean): 61 (KJS::FunctionCallDotNode::evaluateToInt32): 62 (KJS::FunctionCallDotNode::evaluateToUInt32): 63 (KJS::PostDecLocalVarNode::inlineEvaluateToNumber): 64 (KJS::PostDecLocalVarNode::evaluateToNumber): 65 (KJS::PostDecLocalVarNode::evaluateToBoolean): 66 (KJS::PostDecLocalVarNode::evaluateToInt32): 67 (KJS::PostDecLocalVarNode::evaluateToUInt32): 68 (KJS::typeStringForValue): 69 (KJS::UnaryPlusNode::evaluate): 70 (KJS::UnaryPlusNode::evaluateToBoolean): 71 (KJS::UnaryPlusNode::evaluateToNumber): 72 (KJS::UnaryPlusNode::evaluateToInt32): 73 (KJS::BitwiseNotNode::inlineEvaluateToInt32): 74 (KJS::BitwiseNotNode::evaluate): 75 (KJS::BitwiseNotNode::evaluateToNumber): 76 (KJS::BitwiseNotNode::evaluateToBoolean): 77 (KJS::BitwiseNotNode::evaluateToInt32): 78 (KJS::MultNode::evaluateToBoolean): 79 (KJS::MultNode::evaluateToInt32): 80 (KJS::MultNode::evaluateToUInt32): 81 (KJS::DivNode::evaluateToInt32): 82 (KJS::DivNode::evaluateToUInt32): 83 (KJS::ModNode::evaluateToBoolean): 84 (KJS::ModNode::evaluateToInt32): 85 (KJS::ModNode::evaluateToUInt32): 86 (KJS::AddNode::evaluateToNumber): 87 (KJS::AddNode::evaluateToInt32): 88 (KJS::AddNode::evaluateToUInt32): 89 (KJS::AddNumbersNode::evaluateToInt32): 90 (KJS::AddNumbersNode::evaluateToUInt32): 91 (KJS::SubNode::evaluateToInt32): 92 (KJS::SubNode::evaluateToUInt32): 93 (KJS::LeftShiftNode::inlineEvaluateToInt32): 94 (KJS::LeftShiftNode::evaluate): 95 (KJS::LeftShiftNode::evaluateToNumber): 96 (KJS::LeftShiftNode::evaluateToInt32): 97 (KJS::RightShiftNode::inlineEvaluateToInt32): 98 (KJS::RightShiftNode::evaluate): 99 (KJS::RightShiftNode::evaluateToNumber): 100 (KJS::RightShiftNode::evaluateToInt32): 101 (KJS::UnsignedRightShiftNode::inlineEvaluateToUInt32): 102 (KJS::UnsignedRightShiftNode::evaluate): 103 (KJS::UnsignedRightShiftNode::evaluateToNumber): 104 (KJS::UnsignedRightShiftNode::evaluateToInt32): 105 (KJS::LessNode::inlineEvaluateToBoolean): 106 (KJS::LessNode::evaluate): 107 (KJS::LessNode::evaluateToBoolean): 108 (KJS::LessNumbersNode::inlineEvaluateToBoolean): 109 (KJS::LessNumbersNode::evaluate): 110 (KJS::LessNumbersNode::evaluateToBoolean): 111 (KJS::LessStringsNode::inlineEvaluateToBoolean): 112 (KJS::LessStringsNode::evaluate): 113 (KJS::BitAndNode::evaluate): 114 (KJS::BitAndNode::inlineEvaluateToInt32): 115 (KJS::BitAndNode::evaluateToNumber): 116 (KJS::BitAndNode::evaluateToBoolean): 117 (KJS::BitAndNode::evaluateToInt32): 118 (KJS::BitXOrNode::inlineEvaluateToInt32): 119 (KJS::BitXOrNode::evaluate): 120 (KJS::BitXOrNode::evaluateToNumber): 121 (KJS::BitXOrNode::evaluateToBoolean): 122 (KJS::BitXOrNode::evaluateToInt32): 123 (KJS::BitOrNode::inlineEvaluateToInt32): 124 (KJS::BitOrNode::evaluate): 125 (KJS::BitOrNode::evaluateToNumber): 126 (KJS::BitOrNode::evaluateToBoolean): 127 (KJS::BitOrNode::evaluateToInt32): 128 (KJS::ConditionalNode::evaluateToNumber): 129 (KJS::ConditionalNode::evaluateToInt32): 130 (KJS::ConditionalNode::evaluateToUInt32): 131 (KJS::valueForReadModifyAssignment): 132 (KJS::AssignExprNode::evaluate): 133 (KJS::AssignExprNode::evaluateToBoolean): 134 (KJS::AssignExprNode::evaluateToNumber): 135 (KJS::AssignExprNode::evaluateToInt32): 136 (KJS::VarDeclNode::handleSlowCase): 137 * kjs/nodes.h: 138 (KJS::FunctionCallResolveNode::precedence): 139 (KJS::AddNode::precedence): 140 (KJS::AddNode::): 141 (KJS::LessNumbersNode::): 142 (KJS::LessStringsNode::): 143 * kjs/value.cpp: 144 (KJS::JSValue::toInt32SlowCase): 145 (KJS::JSValue::toUInt32SlowCase): 146 * kjs/value.h: 147 (KJS::JSValue::asCell): 148 (KJS::JSValue::toInt32): 149 (KJS::JSValue::toUInt32): 150 1 151 2007-11-12 Alexey Proskuryakov <[email protected]> 2 152 -
trunk/JavaScriptCore/kjs/JSImmediate.h
r27632 r27747 117 117 static bool getTruncatedUInt32(const JSValue*, uint32_t&); 118 118 119 static int32_t getTruncatedInt32(const JSValue*); 120 119 121 static JSValue* trueImmediate(); 120 122 static JSValue* falseImmediate(); … … 239 241 } 240 242 243 ALWAYS_INLINE int32_t JSImmediate::getTruncatedInt32(const JSValue* v) 244 { 245 return static_cast<int32_t>(unTag(v)) >> 2; 246 } 247 241 248 ALWAYS_INLINE double JSImmediate::toDouble(const JSValue* v) 242 249 { 243 250 ASSERT(isImmediate(v)); 244 const int32_t i = static_cast<int32_t>(unTag(v)) >> 2;251 const int32_t i = getTruncatedInt32(v); 245 252 if (JSImmediate::getTag(v) == UndefinedType && i) 246 253 return std::numeric_limits<double>::quiet_NaN(); … … 250 257 ALWAYS_INLINE bool JSImmediate::getUInt32(const JSValue* v, uint32_t& i) 251 258 { 252 const int32_t si = static_cast<int32_t>(unTag(v)) >> 2;259 const int32_t si = getTruncatedInt32(v); 253 260 i = si; 254 261 return isNumber(v) & (si >= 0); … … 257 264 ALWAYS_INLINE bool JSImmediate::getTruncatedInt32(const JSValue* v, int32_t& i) 258 265 { 259 i = static_cast<int32_t>(unTag(v)) >> 2;266 i = getTruncatedInt32(v); 260 267 return isNumber(v); 261 268 } -
trunk/JavaScriptCore/kjs/nodes.cpp
r27702 r27747 60 60 if (exec->hadException()) { \ 61 61 handleException(exec); \ 62 return 0 .0; \62 return 0; \ 63 63 } 64 64 … … 228 228 JSValue* value = evaluate(exec); 229 229 KJS_CHECKEXCEPTIONNUMBER 230 // No need to check exception after toNumber, caller will do so right after evaluateToNumber() call231 230 return value->toNumber(exec); 232 231 } … … 237 236 KJS_CHECKEXCEPTIONBOOLEAN 238 237 return value->toBoolean(exec); 238 } 239 240 int32_t ExpressionNode::evaluateToInt32(ExecState* exec) 241 { 242 JSValue* value = evaluate(exec); 243 KJS_CHECKEXCEPTIONNUMBER 244 return value->toInt32(exec); 245 } 246 247 uint32_t ExpressionNode::evaluateToUInt32(ExecState* exec) 248 { 249 JSValue* value = evaluate(exec); 250 KJS_CHECKEXCEPTIONNUMBER 251 return value->toUInt32(exec); 239 252 } 240 253 … … 426 439 } 427 440 441 int32_t NumberNode::evaluateToInt32(ExecState*) 442 { 443 return JSValue::toInt32(m_double); 444 } 445 446 uint32_t NumberNode::evaluateToUInt32(ExecState*) 447 { 448 return JSValue::toUInt32(m_double); 449 } 450 428 451 // ------------------------------ ImmediateNumberNode ----------------------------------- 429 452 … … 431 454 { 432 455 return m_value; 456 } 457 458 int32_t ImmediateNumberNode::evaluateToInt32(ExecState*) 459 { 460 return JSImmediate::getTruncatedInt32(m_value); 461 } 462 463 uint32_t ImmediateNumberNode::evaluateToUInt32(ExecState*) 464 { 465 uint32_t i; 466 if (JSImmediate::getTruncatedUInt32(m_value, i)) 467 return i; 468 bool ok; 469 return JSValue::toUInt32SlowCase(m_double, ok); 433 470 } 434 471 … … 468 505 469 506 // ECMA 11.1.2 & 10.1.4 470 JSValue *ResolveNode::evaluate(ExecState *exec)507 JSValue* ResolveNode::inlineEvaluate(ExecState* exec) 471 508 { 472 509 // Check for missed optimization opportunity. … … 493 530 } 494 531 532 JSValue* ResolveNode::evaluate(ExecState* exec) 533 { 534 return inlineEvaluate(exec); 535 } 536 537 double ResolveNode::evaluateToNumber(ExecState* exec) 538 { 539 JSValue* v = inlineEvaluate(exec); 540 KJS_CHECKEXCEPTIONNUMBER 541 return v->toNumber(exec); 542 } 543 544 bool ResolveNode::evaluateToBoolean(ExecState* exec) 545 { 546 JSValue* v = inlineEvaluate(exec); 547 KJS_CHECKEXCEPTIONBOOLEAN 548 return v->toBoolean(exec); 549 } 550 551 int32_t ResolveNode::evaluateToInt32(ExecState* exec) 552 { 553 JSValue* v = inlineEvaluate(exec); 554 KJS_CHECKEXCEPTIONNUMBER 555 return v->toInt32(exec); 556 } 557 558 uint32_t ResolveNode::evaluateToUInt32(ExecState* exec) 559 { 560 JSValue* v = inlineEvaluate(exec); 561 KJS_CHECKEXCEPTIONNUMBER 562 return v->toUInt32(exec); 563 } 564 495 565 void ResolveNode::optimizeVariableAccess(FunctionBodyNode* functionBody, DeclarationStacks::NodeStack&) 496 566 { … … 520 590 { 521 591 return inlineEvaluate(exec)->toBoolean(exec); 592 } 593 594 int32_t LocalVarAccessNode::evaluateToInt32(ExecState* exec) 595 { 596 return inlineEvaluate(exec)->toInt32(exec); 597 } 598 599 uint32_t LocalVarAccessNode::evaluateToUInt32(ExecState* exec) 600 { 601 return inlineEvaluate(exec)->toUInt32(exec); 522 602 } 523 603 … … 673 753 double BracketAccessorNode::evaluateToNumber(ExecState* exec) 674 754 { 675 return inlineEvaluate(exec)->toNumber(exec); 755 JSValue* v = inlineEvaluate(exec); 756 KJS_CHECKEXCEPTIONNUMBER 757 return v->toNumber(exec); 676 758 } 677 759 678 760 bool BracketAccessorNode::evaluateToBoolean(ExecState* exec) 679 761 { 680 return inlineEvaluate(exec)->toBoolean(exec); 681 } 762 JSValue* v = inlineEvaluate(exec); 763 KJS_CHECKEXCEPTIONBOOLEAN 764 return v->toBoolean(exec); 765 } 766 767 int32_t BracketAccessorNode::evaluateToInt32(ExecState* exec) 768 { 769 JSValue* v = inlineEvaluate(exec); 770 KJS_CHECKEXCEPTIONNUMBER 771 return v->toInt32(exec); 772 } 773 774 uint32_t BracketAccessorNode::evaluateToUInt32(ExecState* exec) 775 { 776 JSValue* v = inlineEvaluate(exec); 777 KJS_CHECKEXCEPTIONNUMBER 778 return v->toUInt32(exec); 779 } 682 780 683 781 // ------------------------------ DotAccessorNode -------------------------------- … … 689 787 690 788 // ECMA 11.2.1b 691 JSValue *DotAccessorNode::evaluate(ExecState *exec) 692 { 693 JSValue *v = expr->evaluate(exec); 694 KJS_CHECKEXCEPTIONVALUE 695 return v->toObject(exec)->get(exec, ident); 696 697 } 789 JSValue* DotAccessorNode::inlineEvaluate(ExecState* exec) 790 { 791 JSValue* v = expr->evaluate(exec); 792 KJS_CHECKEXCEPTIONVALUE 793 return v->toObject(exec)->get(exec, ident); 794 } 795 796 JSValue* DotAccessorNode::evaluate(ExecState* exec) 797 { 798 return inlineEvaluate(exec); 799 } 800 801 double DotAccessorNode::evaluateToNumber(ExecState* exec) 802 { 803 JSValue* v = inlineEvaluate(exec); 804 KJS_CHECKEXCEPTIONNUMBER 805 return v->toNumber(exec); 806 } 807 808 bool DotAccessorNode::evaluateToBoolean(ExecState* exec) 809 { 810 JSValue* v = inlineEvaluate(exec); 811 KJS_CHECKEXCEPTIONBOOLEAN 812 return v->toBoolean(exec); 813 } 814 815 int32_t DotAccessorNode::evaluateToInt32(ExecState* exec) 816 { 817 JSValue* v = inlineEvaluate(exec); 818 KJS_CHECKEXCEPTIONNUMBER 819 return v->toInt32(exec); 820 } 821 822 uint32_t DotAccessorNode::evaluateToUInt32(ExecState* exec) 823 { 824 JSValue* v = inlineEvaluate(exec); 825 KJS_CHECKEXCEPTIONNUMBER 826 return v->toUInt32(exec); 827 } 698 828 699 829 // ------------------------------ ArgumentListNode ----------------------------- … … 736 866 // ECMA 11.2.2 737 867 738 JSValue *NewExprNode::evaluate(ExecState *exec)739 { 740 JSValue *v = expr->evaluate(exec);868 JSValue* NewExprNode::inlineEvaluate(ExecState* exec) 869 { 870 JSValue* v = expr->evaluate(exec); 741 871 KJS_CHECKEXCEPTIONVALUE 742 872 … … 747 877 } 748 878 749 if (!v->isObject()) {879 if (!v->isObject()) 750 880 return throwError(exec, TypeError, "Value %s (result of expression %s) is not an object. Cannot be used with new.", v, expr.get()); 751 }752 881 753 882 JSObject *constr = static_cast<JSObject*>(v); 754 if (!constr->implementsConstruct()) {883 if (!constr->implementsConstruct()) 755 884 return throwError(exec, TypeError, "Value %s (result of expression %s) is not a constructor. Cannot be used with new.", v, expr.get()); 756 }757 885 758 886 return constr->construct(exec, argList); 759 887 } 888 889 JSValue* NewExprNode::evaluate(ExecState* exec) 890 { 891 return inlineEvaluate(exec); 892 } 893 894 double NewExprNode::evaluateToNumber(ExecState* exec) 895 { 896 JSValue* v = inlineEvaluate(exec); 897 KJS_CHECKEXCEPTIONNUMBER 898 return v->toNumber(exec); 899 } 900 901 bool NewExprNode::evaluateToBoolean(ExecState* exec) 902 { 903 JSValue* v = inlineEvaluate(exec); 904 KJS_CHECKEXCEPTIONBOOLEAN 905 return v->toBoolean(exec); 906 } 907 908 int32_t NewExprNode::evaluateToInt32(ExecState* exec) 909 { 910 JSValue* v = inlineEvaluate(exec); 911 KJS_CHECKEXCEPTIONNUMBER 912 return v->toInt32(exec); 913 } 914 915 uint32_t NewExprNode::evaluateToUInt32(ExecState* exec) 916 { 917 JSValue* v = inlineEvaluate(exec); 918 KJS_CHECKEXCEPTIONNUMBER 919 return v->toUInt32(exec); 920 } 760 921 761 922 void FunctionCallValueNode::optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack& nodeStack) … … 800 961 801 962 // ECMA 11.2.3 802 JSValue *FunctionCallResolveNode::evaluate(ExecState *exec)963 JSValue* FunctionCallResolveNode::inlineEvaluate(ExecState* exec) 803 964 { 804 965 // Check for missed optimization opportunity. … … 820 981 KJS_CHECKEXCEPTIONVALUE 821 982 822 if (!v->isObject()) {983 if (!v->isObject()) 823 984 return throwError(exec, TypeError, "Value %s (result of expression %s) is not object.", v, ident); 824 }825 985 826 986 JSObject *func = static_cast<JSObject*>(v); 827 987 828 if (!func->implementsCall()) {988 if (!func->implementsCall()) 829 989 return throwError(exec, TypeError, "Object %s (result of expression %s) does not allow calls.", v, ident); 830 }831 990 832 991 List argList; … … 852 1011 } 853 1012 854 JSValue* LocalVarFunctionCallNode::evaluate(ExecState* exec) 1013 JSValue* FunctionCallResolveNode::evaluate(ExecState* exec) 1014 { 1015 return inlineEvaluate(exec); 1016 } 1017 1018 double FunctionCallResolveNode::evaluateToNumber(ExecState* exec) 1019 { 1020 JSValue* v = inlineEvaluate(exec); 1021 KJS_CHECKEXCEPTIONNUMBER 1022 return v->toNumber(exec); 1023 } 1024 1025 bool FunctionCallResolveNode::evaluateToBoolean(ExecState* exec) 1026 { 1027 JSValue* v = inlineEvaluate(exec); 1028 KJS_CHECKEXCEPTIONBOOLEAN 1029 return v->toBoolean(exec); 1030 } 1031 1032 int32_t FunctionCallResolveNode::evaluateToInt32(ExecState* exec) 1033 { 1034 JSValue* v = inlineEvaluate(exec); 1035 KJS_CHECKEXCEPTIONNUMBER 1036 return v->toInt32(exec); 1037 } 1038 1039 uint32_t FunctionCallResolveNode::evaluateToUInt32(ExecState* exec) 1040 { 1041 JSValue* v = inlineEvaluate(exec); 1042 KJS_CHECKEXCEPTIONNUMBER 1043 return v->toUInt32(exec); 1044 } 1045 1046 JSValue* LocalVarFunctionCallNode::inlineEvaluate(ExecState* exec) 855 1047 { 856 1048 ASSERT(static_cast<ActivationImp*>(exec->variableObject())->isActivation()); … … 871 1063 872 1064 return func->call(exec, exec->dynamicInterpreter()->globalObject(), argList); 1065 } 1066 1067 JSValue* LocalVarFunctionCallNode::evaluate(ExecState* exec) 1068 { 1069 return inlineEvaluate(exec); 1070 } 1071 1072 double LocalVarFunctionCallNode::evaluateToNumber(ExecState* exec) 1073 { 1074 JSValue* v = inlineEvaluate(exec); 1075 KJS_CHECKEXCEPTIONNUMBER 1076 return v->toNumber(exec); 1077 } 1078 1079 bool LocalVarFunctionCallNode::evaluateToBoolean(ExecState* exec) 1080 { 1081 JSValue* v = inlineEvaluate(exec); 1082 KJS_CHECKEXCEPTIONBOOLEAN 1083 return v->toBoolean(exec); 1084 } 1085 1086 int32_t LocalVarFunctionCallNode::evaluateToInt32(ExecState* exec) 1087 { 1088 JSValue* v = inlineEvaluate(exec); 1089 KJS_CHECKEXCEPTIONNUMBER 1090 return v->toInt32(exec); 1091 } 1092 1093 uint32_t LocalVarFunctionCallNode::evaluateToUInt32(ExecState* exec) 1094 { 1095 JSValue* v = inlineEvaluate(exec); 1096 KJS_CHECKEXCEPTIONNUMBER 1097 return v->toUInt32(exec); 873 1098 } 874 1099 … … 949 1174 950 1175 // ECMA 11.2.3 951 JSValue *FunctionCallDotNode::evaluate(ExecState *exec)1176 JSValue* FunctionCallDotNode::inlineEvaluate(ExecState* exec) 952 1177 { 953 1178 JSValue *baseVal = base->evaluate(exec); … … 977 1202 978 1203 return func->call(exec, thisObj, argList); 1204 } 1205 1206 JSValue* FunctionCallDotNode::evaluate(ExecState* exec) 1207 { 1208 return inlineEvaluate(exec); 1209 } 1210 1211 double FunctionCallDotNode::evaluateToNumber(ExecState* exec) 1212 { 1213 JSValue* v = inlineEvaluate(exec); 1214 KJS_CHECKEXCEPTIONNUMBER 1215 return v->toNumber(exec); 1216 } 1217 1218 bool FunctionCallDotNode::evaluateToBoolean(ExecState* exec) 1219 { 1220 JSValue* v = inlineEvaluate(exec); 1221 KJS_CHECKEXCEPTIONBOOLEAN 1222 return v->toBoolean(exec); 1223 } 1224 1225 int32_t FunctionCallDotNode::evaluateToInt32(ExecState* exec) 1226 { 1227 JSValue* v = inlineEvaluate(exec); 1228 KJS_CHECKEXCEPTIONNUMBER 1229 return v->toInt32(exec); 1230 } 1231 1232 uint32_t FunctionCallDotNode::evaluateToUInt32(ExecState* exec) 1233 { 1234 JSValue* v = inlineEvaluate(exec); 1235 KJS_CHECKEXCEPTIONNUMBER 1236 return v->toUInt32(exec); 979 1237 } 980 1238 … … 1091 1349 *slot = jsNumber(v->toNumber(exec) - 1); 1092 1350 return v; 1351 } 1352 1353 double PostDecLocalVarNode::inlineEvaluateToNumber(ExecState* exec) 1354 { 1355 ASSERT(static_cast<ActivationImp*>(exec->variableObject())->isActivation()); 1356 ASSERT(static_cast<ActivationImp*>(exec->variableObject()) == exec->scopeChain().top()); 1357 1358 JSValue** slot = &exec->localStorage()[m_index].value; 1359 double n = (*slot)->toNumber(exec); 1360 *slot = jsNumber(n - 1); 1361 return n; 1362 } 1363 1364 double PostDecLocalVarNode::evaluateToNumber(ExecState* exec) 1365 { 1366 return inlineEvaluateToNumber(exec); 1367 } 1368 1369 bool PostDecLocalVarNode::evaluateToBoolean(ExecState* exec) 1370 { 1371 return inlineEvaluateToNumber(exec); 1372 } 1373 1374 int32_t PostDecLocalVarNode::evaluateToInt32(ExecState* exec) 1375 { 1376 return JSValue::toInt32(inlineEvaluateToNumber(exec)); 1377 } 1378 1379 uint32_t PostDecLocalVarNode::evaluateToUInt32(ExecState* exec) 1380 { 1381 return JSValue::toUInt32(inlineEvaluateToNumber(exec)); 1093 1382 } 1094 1383 … … 1357 1646 // as null when doing comparisons. 1358 1647 if (static_cast<JSObject*>(v)->masqueradeAsUndefined()) 1359 return jsString("undefined"); 1648 return jsString("undefined"); 1360 1649 else if (static_cast<JSObject*>(v)->implementsCall()) 1361 1650 return jsString("function"); … … 1648 1937 JSValue* UnaryPlusNode::evaluate(ExecState* exec) 1649 1938 { 1650 JSValue *v = m_expr->evaluate(exec); 1651 KJS_CHECKEXCEPTIONVALUE 1652 1653 return v->toJSNumber(exec); 1939 JSValue *v = m_expr->evaluate(exec); 1940 KJS_CHECKEXCEPTIONVALUE 1941 return v->toJSNumber(exec); 1942 } 1943 1944 bool UnaryPlusNode::evaluateToBoolean(ExecState* exec) 1945 { 1946 return m_expr->evaluateToBoolean(exec); 1947 } 1948 1949 double UnaryPlusNode::evaluateToNumber(ExecState* exec) 1950 { 1951 return m_expr->evaluateToNumber(exec); 1952 } 1953 1954 int32_t UnaryPlusNode::evaluateToInt32(ExecState* exec) 1955 { 1956 return m_expr->evaluateToInt32(exec); 1957 } 1958 1959 uint32_t UnaryPlusNode::evaluateToUInt32(ExecState* exec) 1960 { 1961 return m_expr->evaluateToInt32(exec); 1654 1962 } 1655 1963 … … 1682 1990 1683 1991 // ECMA 11.4.8 1684 JSValue *BitwiseNotNode::evaluate(ExecState *exec) 1685 { 1686 JSValue *v = expr->evaluate(exec); 1687 KJS_CHECKEXCEPTIONVALUE 1688 return jsNumber(~v->toInt32(exec)); 1992 int32_t BitwiseNotNode::inlineEvaluateToInt32(ExecState* exec) 1993 { 1994 return ~expr->evaluateToInt32(exec); 1995 } 1996 1997 JSValue* BitwiseNotNode::evaluate(ExecState* exec) 1998 { 1999 return jsNumber(inlineEvaluateToInt32(exec)); 2000 } 2001 2002 double BitwiseNotNode::evaluateToNumber(ExecState* exec) 2003 { 2004 return inlineEvaluateToInt32(exec); 2005 } 2006 2007 bool BitwiseNotNode::evaluateToBoolean(ExecState* exec) 2008 { 2009 return inlineEvaluateToInt32(exec); 2010 } 2011 2012 int32_t BitwiseNotNode::evaluateToInt32(ExecState* exec) 2013 { 2014 return inlineEvaluateToInt32(exec); 2015 } 2016 2017 uint32_t BitwiseNotNode::evaluateToUInt32(ExecState* exec) 2018 { 2019 return inlineEvaluateToInt32(exec); 1689 2020 } 1690 2021 … … 1734 2065 } 1735 2066 2067 bool MultNode::evaluateToBoolean(ExecState* exec) 2068 { 2069 return inlineEvaluateToNumber(exec); 2070 } 2071 2072 int32_t MultNode::evaluateToInt32(ExecState* exec) 2073 { 2074 return JSValue::toInt32(inlineEvaluateToNumber(exec)); 2075 } 2076 2077 uint32_t MultNode::evaluateToUInt32(ExecState* exec) 2078 { 2079 return JSValue::toUInt32(inlineEvaluateToNumber(exec)); 2080 } 2081 1736 2082 void DivNode::optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack& nodeStack) 1737 2083 { … … 1759 2105 } 1760 2106 2107 int32_t DivNode::evaluateToInt32(ExecState* exec) 2108 { 2109 return JSValue::toInt32(inlineEvaluateToNumber(exec)); 2110 } 2111 2112 uint32_t DivNode::evaluateToUInt32(ExecState* exec) 2113 { 2114 return JSValue::toUInt32(inlineEvaluateToNumber(exec)); 2115 } 2116 1761 2117 void ModNode::optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack& nodeStack) 1762 2118 { … … 1782 2138 { 1783 2139 return inlineEvaluateToNumber(exec); 2140 } 2141 2142 bool ModNode::evaluateToBoolean(ExecState* exec) 2143 { 2144 return inlineEvaluateToNumber(exec); 2145 } 2146 2147 int32_t ModNode::evaluateToInt32(ExecState* exec) 2148 { 2149 return JSValue::toInt32(inlineEvaluateToNumber(exec)); 2150 } 2151 2152 uint32_t ModNode::evaluateToUInt32(ExecState* exec) 2153 { 2154 return JSValue::toUInt32(inlineEvaluateToNumber(exec)); 1784 2155 } 1785 2156 … … 1899 2270 } 1900 2271 1901 double AddNode:: evaluateToNumber(ExecState* exec)2272 double AddNode::inlineEvaluateToNumber(ExecState* exec) 1902 2273 { 1903 2274 JSValue* v1 = term1->evaluate(exec); … … 1910 2281 } 1911 2282 2283 double AddNode::evaluateToNumber(ExecState* exec) 2284 { 2285 return inlineEvaluateToNumber(exec); 2286 } 2287 2288 int32_t AddNode::evaluateToInt32(ExecState* exec) 2289 { 2290 return JSValue::toInt32(inlineEvaluateToNumber(exec)); 2291 } 2292 2293 uint32_t AddNode::evaluateToUInt32(ExecState* exec) 2294 { 2295 return JSValue::toUInt32(inlineEvaluateToNumber(exec)); 2296 } 2297 1912 2298 double AddNumbersNode::inlineEvaluateToNumber(ExecState* exec) 1913 2299 { … … 1928 2314 } 1929 2315 2316 int32_t AddNumbersNode::evaluateToInt32(ExecState* exec) 2317 { 2318 return JSValue::toInt32(inlineEvaluateToNumber(exec)); 2319 } 2320 2321 uint32_t AddNumbersNode::evaluateToUInt32(ExecState* exec) 2322 { 2323 return JSValue::toUInt32(inlineEvaluateToNumber(exec)); 2324 } 2325 1930 2326 JSValue* AddStringsNode::evaluate(ExecState* exec) 1931 2327 { … … 1988 2384 } 1989 2385 2386 int32_t SubNode::evaluateToInt32(ExecState* exec) 2387 { 2388 return JSValue::toInt32(inlineEvaluateToNumber(exec)); 2389 } 2390 2391 uint32_t SubNode::evaluateToUInt32(ExecState* exec) 2392 { 2393 return JSValue::toUInt32(inlineEvaluateToNumber(exec)); 2394 } 2395 1990 2396 // ------------------------------ Shift Nodes ------------------------------------ 1991 2397 … … 1997 2403 1998 2404 // ECMA 11.7.1 1999 JSValue *LeftShiftNode::evaluate(ExecState *exec) 2000 { 2001 JSValue *v1 = term1->evaluate(exec); 2002 KJS_CHECKEXCEPTIONVALUE 2003 JSValue *v2 = term2->evaluate(exec); 2004 KJS_CHECKEXCEPTIONVALUE 2005 unsigned int i2 = v2->toUInt32(exec); 2006 i2 &= 0x1f; 2007 2008 return jsNumber(v1->toInt32(exec) << i2); 2405 int32_t LeftShiftNode::inlineEvaluateToInt32(ExecState* exec) 2406 { 2407 int i1 = term1->evaluateToInt32(exec); 2408 KJS_CHECKEXCEPTIONNUMBER 2409 unsigned int i2 = term2->evaluateToUInt32(exec) & 0x1f; 2410 return (i1 << i2); 2411 } 2412 2413 JSValue* LeftShiftNode::evaluate(ExecState* exec) 2414 { 2415 return jsNumber(inlineEvaluateToInt32(exec)); 2416 } 2417 2418 double LeftShiftNode::evaluateToNumber(ExecState* exec) 2419 { 2420 return inlineEvaluateToInt32(exec); 2421 } 2422 2423 int32_t LeftShiftNode::evaluateToInt32(ExecState* exec) 2424 { 2425 return inlineEvaluateToInt32(exec); 2426 } 2427 2428 uint32_t LeftShiftNode::evaluateToUInt32(ExecState* exec) 2429 { 2430 return inlineEvaluateToInt32(exec); 2009 2431 } 2010 2432 … … 2016 2438 2017 2439 // ECMA 11.7.2 2018 JSValue *RightShiftNode::evaluate(ExecState *exec) 2019 { 2020 JSValue *v1 = term1->evaluate(exec); 2021 KJS_CHECKEXCEPTIONVALUE 2022 JSValue *v2 = term2->evaluate(exec); 2023 KJS_CHECKEXCEPTIONVALUE 2024 unsigned int i2 = v2->toUInt32(exec); 2025 i2 &= 0x1f; 2026 2027 return jsNumber(v1->toInt32(exec) >> i2); 2440 int32_t RightShiftNode::inlineEvaluateToInt32(ExecState* exec) 2441 { 2442 int i1 = term1->evaluateToInt32(exec); 2443 KJS_CHECKEXCEPTIONNUMBER 2444 unsigned int i2 = term2->evaluateToUInt32(exec) & 0x1f; 2445 return (i1 >> i2); 2446 } 2447 2448 JSValue* RightShiftNode::evaluate(ExecState* exec) 2449 { 2450 return jsNumber(inlineEvaluateToInt32(exec)); 2451 } 2452 2453 double RightShiftNode::evaluateToNumber(ExecState* exec) 2454 { 2455 return inlineEvaluateToInt32(exec); 2456 } 2457 2458 int32_t RightShiftNode::evaluateToInt32(ExecState* exec) 2459 { 2460 return inlineEvaluateToInt32(exec); 2461 } 2462 2463 uint32_t RightShiftNode::evaluateToUInt32(ExecState* exec) 2464 { 2465 return inlineEvaluateToInt32(exec); 2028 2466 } 2029 2467 … … 2035 2473 2036 2474 // ECMA 11.7.3 2037 JSValue *UnsignedRightShiftNode::evaluate(ExecState *exec) 2038 { 2039 JSValue *v1 = term1->evaluate(exec); 2040 KJS_CHECKEXCEPTIONVALUE 2041 JSValue *v2 = term2->evaluate(exec); 2042 KJS_CHECKEXCEPTIONVALUE 2043 unsigned int i2 = v2->toUInt32(exec); 2044 i2 &= 0x1f; 2045 2046 return jsNumber(v1->toUInt32(exec) >> i2); 2475 uint32_t UnsignedRightShiftNode::inlineEvaluateToUInt32(ExecState* exec) 2476 { 2477 unsigned int i1 = term1->evaluateToUInt32(exec); 2478 KJS_CHECKEXCEPTIONNUMBER 2479 unsigned int i2 = term2->evaluateToUInt32(exec) & 0x1f; 2480 return (i1 >> i2); 2481 } 2482 2483 JSValue* UnsignedRightShiftNode::evaluate(ExecState* exec) 2484 { 2485 return jsNumber(inlineEvaluateToUInt32(exec)); 2486 } 2487 2488 double UnsignedRightShiftNode::evaluateToNumber(ExecState* exec) 2489 { 2490 return inlineEvaluateToUInt32(exec); 2491 } 2492 2493 int32_t UnsignedRightShiftNode::evaluateToInt32(ExecState* exec) 2494 { 2495 return inlineEvaluateToUInt32(exec); 2496 } 2497 2498 uint32_t UnsignedRightShiftNode::evaluateToUInt32(ExecState* exec) 2499 { 2500 return inlineEvaluateToUInt32(exec); 2047 2501 } 2048 2502 … … 2086 2540 2087 2541 // ECMA 11.8.1 2088 JSValue* LessNode::evaluate(ExecState* exec) 2089 { 2090 JSValue* v1 = expr1->evaluate(exec); 2091 KJS_CHECKEXCEPTIONVALUE 2092 JSValue* v2 = expr2->evaluate(exec); 2093 KJS_CHECKEXCEPTIONVALUE 2094 return jsBoolean(lessThan(exec, v1, v2)); 2095 } 2096 2097 bool LessNode::evaluateToBoolean(ExecState* exec) 2542 bool LessNode::inlineEvaluateToBoolean(ExecState* exec) 2098 2543 { 2099 2544 JSValue* v1 = expr1->evaluate(exec); … … 2104 2549 } 2105 2550 2551 JSValue* LessNode::evaluate(ExecState* exec) 2552 { 2553 return jsBoolean(inlineEvaluateToBoolean(exec)); 2554 } 2555 2556 bool LessNode::evaluateToBoolean(ExecState* exec) 2557 { 2558 return inlineEvaluateToBoolean(exec); 2559 } 2560 2561 bool LessNumbersNode::inlineEvaluateToBoolean(ExecState* exec) 2562 { 2563 double n1 = expr1->evaluateToNumber(exec); 2564 KJS_CHECKEXCEPTIONVALUE 2565 double n2 = expr2->evaluateToNumber(exec); 2566 return n1 < n2; 2567 } 2568 2106 2569 JSValue* LessNumbersNode::evaluate(ExecState* exec) 2107 2570 { 2108 double n1 = expr1->evaluateToNumber(exec); 2109 KJS_CHECKEXCEPTIONVALUE 2110 double n2 = expr2->evaluateToNumber(exec); 2111 return jsBoolean(n1 < n2); 2571 return jsBoolean(inlineEvaluateToBoolean(exec)); 2572 } 2573 2574 bool LessNumbersNode::evaluateToBoolean(ExecState* exec) 2575 { 2576 return inlineEvaluateToBoolean(exec); 2577 } 2578 2579 bool LessStringsNode::inlineEvaluateToBoolean(ExecState* exec) 2580 { 2581 JSValue* v1 = expr1->evaluate(exec); 2582 KJS_CHECKEXCEPTIONVALUE 2583 JSValue* v2 = expr2->evaluate(exec); 2584 return static_cast<StringImp*>(v1)->value() < static_cast<StringImp*>(v2)->value(); 2112 2585 } 2113 2586 2114 2587 JSValue* LessStringsNode::evaluate(ExecState* exec) 2115 2588 { 2116 JSValue* v1 = expr1->evaluate(exec); 2117 KJS_CHECKEXCEPTIONVALUE 2118 JSValue* v2 = expr2->evaluate(exec); 2119 return jsBoolean(static_cast<StringImp*>(v1)->value() < static_cast<StringImp*>(v2)->value()); 2589 return jsBoolean(inlineEvaluateToBoolean(exec)); 2590 } 2591 2592 bool LessStringsNode::evaluateToBoolean(ExecState* exec) 2593 { 2594 return inlineEvaluateToBoolean(exec); 2120 2595 } 2121 2596 … … 2400 2875 2401 2876 // ECMA 11.10 2402 JSValue *BitAndNode::evaluate(ExecState *exec)2877 JSValue* BitAndNode::evaluate(ExecState* exec) 2403 2878 { 2404 JSValue *v1 = expr1->evaluate(exec); 2405 KJS_CHECKEXCEPTIONVALUE 2406 JSValue *v2 = expr2->evaluate(exec); 2407 KJS_CHECKEXCEPTIONVALUE 2408 2409 return jsNumberFromAnd(exec, v1, v2); 2879 JSValue *v1 = expr1->evaluate(exec); 2880 KJS_CHECKEXCEPTIONVALUE 2881 JSValue *v2 = expr2->evaluate(exec); 2882 KJS_CHECKEXCEPTIONVALUE 2883 2884 return jsNumberFromAnd(exec, v1, v2); 2885 } 2886 2887 int32_t BitAndNode::inlineEvaluateToInt32(ExecState* exec) 2888 { 2889 int32_t i1 = expr1->evaluateToInt32(exec); 2890 KJS_CHECKEXCEPTIONNUMBER 2891 int32_t i2 = expr2->evaluateToInt32(exec); 2892 return (i1 & i2); 2893 } 2894 2895 double BitAndNode::evaluateToNumber(ExecState* exec) 2896 { 2897 return inlineEvaluateToInt32(exec); 2898 } 2899 2900 bool BitAndNode::evaluateToBoolean(ExecState* exec) 2901 { 2902 return inlineEvaluateToInt32(exec); 2903 } 2904 2905 int32_t BitAndNode::evaluateToInt32(ExecState* exec) 2906 { 2907 return inlineEvaluateToInt32(exec); 2908 } 2909 2910 uint32_t BitAndNode::evaluateToUInt32(ExecState* exec) 2911 { 2912 return inlineEvaluateToInt32(exec); 2410 2913 } 2411 2914 … … 2416 2919 } 2417 2920 2418 JSValue *BitXOrNode::evaluate(ExecState *exec) 2419 { 2420 JSValue *v1 = expr1->evaluate(exec); 2421 KJS_CHECKEXCEPTIONVALUE 2422 JSValue *v2 = expr2->evaluate(exec); 2423 KJS_CHECKEXCEPTIONVALUE 2424 2425 return jsNumber(v1->toInt32(exec) ^ v2->toInt32(exec)); 2921 int32_t BitXOrNode::inlineEvaluateToInt32(ExecState* exec) 2922 { 2923 int i1 = expr1->evaluateToInt32(exec); 2924 KJS_CHECKEXCEPTIONNUMBER 2925 int i2 = expr2->evaluateToInt32(exec); 2926 return (i1 ^ i2); 2927 } 2928 2929 JSValue* BitXOrNode::evaluate(ExecState* exec) 2930 { 2931 return jsNumber(inlineEvaluateToInt32(exec)); 2932 } 2933 2934 double BitXOrNode::evaluateToNumber(ExecState* exec) 2935 { 2936 return inlineEvaluateToInt32(exec); 2937 } 2938 2939 bool BitXOrNode::evaluateToBoolean(ExecState* exec) 2940 { 2941 return inlineEvaluateToInt32(exec); 2942 } 2943 2944 int32_t BitXOrNode::evaluateToInt32(ExecState* exec) 2945 { 2946 return inlineEvaluateToInt32(exec); 2947 } 2948 2949 uint32_t BitXOrNode::evaluateToUInt32(ExecState* exec) 2950 { 2951 return inlineEvaluateToInt32(exec); 2426 2952 } 2427 2953 … … 2432 2958 } 2433 2959 2434 JSValue *BitOrNode::evaluate(ExecState *exec) 2435 { 2436 JSValue *v1 = expr1->evaluate(exec); 2437 KJS_CHECKEXCEPTIONVALUE 2438 JSValue *v2 = expr2->evaluate(exec); 2439 KJS_CHECKEXCEPTIONVALUE 2440 2441 return jsNumber(v1->toInt32(exec) | v2->toInt32(exec)); 2960 int32_t BitOrNode::inlineEvaluateToInt32(ExecState* exec) 2961 { 2962 int i1 = expr1->evaluateToInt32(exec); 2963 KJS_CHECKEXCEPTIONNUMBER 2964 int i2 = expr2->evaluateToInt32(exec); 2965 return (i1 | i2); 2966 } 2967 2968 JSValue* BitOrNode::evaluate(ExecState* exec) 2969 { 2970 return jsNumber(inlineEvaluateToInt32(exec)); 2971 } 2972 2973 double BitOrNode::evaluateToNumber(ExecState* exec) 2974 { 2975 return inlineEvaluateToInt32(exec); 2976 } 2977 2978 bool BitOrNode::evaluateToBoolean(ExecState* exec) 2979 { 2980 return inlineEvaluateToInt32(exec); 2981 } 2982 2983 int32_t BitOrNode::evaluateToInt32(ExecState* exec) 2984 { 2985 return inlineEvaluateToInt32(exec); 2986 } 2987 2988 uint32_t BitOrNode::evaluateToUInt32(ExecState* exec) 2989 { 2990 return inlineEvaluateToInt32(exec); 2442 2991 } 2443 2992 … … 2515 3064 KJS_CHECKEXCEPTIONBOOLEAN 2516 3065 return b ? expr1->evaluateToBoolean(exec) : expr2->evaluateToBoolean(exec); 3066 } 3067 3068 double ConditionalNode::evaluateToNumber(ExecState* exec) 3069 { 3070 bool b = logical->evaluateToBoolean(exec); 3071 KJS_CHECKEXCEPTIONNUMBER 3072 return b ? expr1->evaluateToNumber(exec) : expr2->evaluateToNumber(exec); 3073 } 3074 3075 int32_t ConditionalNode::evaluateToInt32(ExecState* exec) 3076 { 3077 bool b = logical->evaluateToBoolean(exec); 3078 KJS_CHECKEXCEPTIONNUMBER 3079 return b ? expr1->evaluateToInt32(exec) : expr2->evaluateToInt32(exec); 3080 } 3081 3082 uint32_t ConditionalNode::evaluateToUInt32(ExecState* exec) 3083 { 3084 bool b = logical->evaluateToBoolean(exec); 3085 KJS_CHECKEXCEPTIONNUMBER 3086 return b ? expr1->evaluateToUInt32(exec) : expr2->evaluateToUInt32(exec); 2517 3087 } 2518 3088 … … 2541 3111 case OpLShift: 2542 3112 i1 = current->toInt32(exec); 2543 i2 = right->evaluate (exec)->toInt32(exec);3113 i2 = right->evaluateToInt32(exec); 2544 3114 v = jsNumber(i1 << i2); 2545 3115 break; 2546 3116 case OpRShift: 2547 3117 i1 = current->toInt32(exec); 2548 i2 = right->evaluate (exec)->toInt32(exec);3118 i2 = right->evaluateToInt32(exec); 2549 3119 v = jsNumber(i1 >> i2); 2550 3120 break; 2551 3121 case OpURShift: 2552 3122 ui = current->toUInt32(exec); 2553 i2 = right->evaluate (exec)->toInt32(exec);3123 i2 = right->evaluateToInt32(exec); 2554 3124 v = jsNumber(ui >> i2); 2555 3125 break; 2556 3126 case OpAndEq: 2557 3127 i1 = current->toInt32(exec); 2558 i2 = right->evaluate (exec)->toInt32(exec);3128 i2 = right->evaluateToInt32(exec); 2559 3129 v = jsNumber(i1 & i2); 2560 3130 break; 2561 3131 case OpXOrEq: 2562 3132 i1 = current->toInt32(exec); 2563 i2 = right->evaluate (exec)->toInt32(exec);3133 i2 = right->evaluateToInt32(exec); 2564 3134 v = jsNumber(i1 ^ i2); 2565 3135 break; 2566 3136 case OpOrEq: 2567 3137 i1 = current->toInt32(exec); 2568 i2 = right->evaluate (exec)->toInt32(exec);3138 i2 = right->evaluateToInt32(exec); 2569 3139 v = jsNumber(i1 | i2); 2570 3140 break; … … 2855 3425 2856 3426 // ECMA 12.2 2857 JSValue *AssignExprNode::evaluate(ExecState *exec) 2858 { 2859 return expr->evaluate(exec); 3427 JSValue* AssignExprNode::evaluate(ExecState* exec) 3428 { 3429 return expr->evaluate(exec); 3430 } 3431 3432 bool AssignExprNode::evaluateToBoolean(ExecState* exec) 3433 { 3434 return expr->evaluateToBoolean(exec); 3435 } 3436 3437 double AssignExprNode::evaluateToNumber(ExecState* exec) 3438 { 3439 return expr->evaluateToNumber(exec); 3440 } 3441 3442 int32_t AssignExprNode::evaluateToInt32(ExecState* exec) 3443 { 3444 return expr->evaluateToInt32(exec); 3445 } 3446 3447 uint32_t AssignExprNode::evaluateToUInt32(ExecState* exec) 3448 { 3449 return expr->evaluateToInt32(exec); 2860 3450 } 2861 3451 … … 2897 3487 { 2898 3488 ScopeChainIterator iter = chain.begin(); 2899 ScopeChainIterator end = chain.end(); 3489 ScopeChainIterator end = chain.end(); 2900 3490 2901 3491 // we must always have something in the scope chain -
trunk/JavaScriptCore/kjs/nodes.h
r27703 r27747 181 181 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL = 0; 182 182 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 183 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 184 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 183 185 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 184 186 … … 235 237 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 236 238 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 239 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 240 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 237 241 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 238 242 virtual Precedence precedence() const { return PrecPrimary; } … … 250 254 ImmediateNumberNode(JSValue* v, double d) KJS_FAST_CALL : NumberNode(d), m_value(v) { ASSERT(v == JSImmediate::from(d)); } 251 255 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 256 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 257 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 252 258 253 259 virtual void setValue(double d) KJS_FAST_CALL { m_double = d; m_value = JSImmediate::from(d); ASSERT(m_value); } … … 307 313 308 314 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 315 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 316 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 317 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 318 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 309 319 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 310 320 virtual Precedence precedence() const { return PrecPrimary; } … … 315 325 316 326 protected: 327 ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*); 317 328 Identifier ident; 318 329 size_t index; // Used by LocalVarAccessNode. … … 331 342 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 332 343 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 344 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 345 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 333 346 private: 334 347 ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*); … … 429 442 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 430 443 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 444 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 445 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 431 446 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 432 447 virtual Precedence precedence() const { return PrecMember; } … … 448 463 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 449 464 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 465 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 466 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 467 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 468 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 450 469 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 451 470 virtual Precedence precedence() const { return PrecMember; } … … 457 476 458 477 private: 478 ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*); 459 479 RefPtr<ExpressionNode> expr; 460 480 Identifier ident; … … 500 520 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 501 521 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 522 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 523 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 524 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 525 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 502 526 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 503 527 virtual Precedence precedence() const { return PrecLeftHandSide; } 504 528 private: 529 ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*); 505 530 RefPtr<ExpressionNode> expr; 506 531 RefPtr<ArgumentsNode> args; … … 536 561 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 537 562 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 563 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 564 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 565 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 566 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 538 567 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 539 568 virtual Precedence precedence() const { return PrecCall; } 540 569 541 570 protected: 571 ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*); 542 572 Identifier ident; 543 573 RefPtr<ArgumentsNode> args; … … 555 585 556 586 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 587 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 588 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 589 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 590 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 591 private: 592 ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*); 557 593 }; 558 594 … … 575 611 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 576 612 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 613 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 614 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 615 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 616 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 577 617 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 578 618 virtual Precedence precedence() const { return PrecCall; } 579 protected: 619 private: 620 ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*); 580 621 RefPtr<ExpressionNode> base; 581 622 Identifier ident; … … 654 695 655 696 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 697 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 698 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 699 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 700 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 656 701 virtual void optimizeForUnnecessaryResult(); 702 private: 703 ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*); 657 704 }; 658 705 … … 981 1028 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 982 1029 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1030 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1031 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1032 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1033 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 983 1034 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 984 1035 virtual Precedence precedence() const { return PrecUnary; } … … 1004 1055 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1005 1056 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1057 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1058 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1059 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1060 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1006 1061 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1007 1062 virtual Precedence precedence() const { return PrecUnary; } 1008 1063 private: 1064 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1009 1065 RefPtr<ExpressionNode> expr; 1010 1066 }; … … 1028 1084 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1029 1085 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1086 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1087 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1088 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1030 1089 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1031 1090 virtual Precedence precedence() const { return PrecMultiplicitave; } … … 1042 1101 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1043 1102 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1103 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1104 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1044 1105 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1045 1106 virtual Precedence precedence() const { return PrecMultiplicitave; } … … 1056 1117 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1057 1118 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1119 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1120 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1121 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1058 1122 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1059 1123 virtual Precedence precedence() const { return PrecMultiplicitave; } … … 1070 1134 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1071 1135 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1136 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1137 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1072 1138 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1073 1139 virtual Precedence precedence() const { return PrecAdditive; } … … 1076 1142 RefPtr<ExpressionNode> term1; 1077 1143 RefPtr<ExpressionNode> term2; 1144 private: 1145 ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*); 1078 1146 }; 1079 1147 … … 1083 1151 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1084 1152 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1153 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1154 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1085 1155 private: 1086 1156 ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1111 1181 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1112 1182 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1183 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1184 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1113 1185 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1114 1186 virtual Precedence precedence() const { return PrecAdditive; } … … 1125 1197 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1126 1198 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1199 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1200 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1201 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1127 1202 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1128 1203 virtual Precedence precedence() const { return PrecShift; } 1129 1204 private: 1205 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1130 1206 RefPtr<ExpressionNode> term1; 1131 1207 RefPtr<ExpressionNode> term2; … … 1138 1214 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1139 1215 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1216 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1217 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1218 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1140 1219 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1141 1220 virtual Precedence precedence() const { return PrecShift; } 1142 1221 private: 1222 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1143 1223 RefPtr<ExpressionNode> term1; 1144 1224 RefPtr<ExpressionNode> term2; … … 1151 1231 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1152 1232 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1233 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1234 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1235 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1153 1236 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1154 1237 virtual Precedence precedence() const { return PrecShift; } 1155 1238 private: 1239 ALWAYS_INLINE uint32_t inlineEvaluateToUInt32(ExecState*); 1156 1240 RefPtr<ExpressionNode> term1; 1157 1241 RefPtr<ExpressionNode> term2; … … 1167 1251 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1168 1252 virtual Precedence precedence() const { return PrecRelational; } 1253 private: 1254 ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*); 1169 1255 protected: 1170 1256 RefPtr<ExpressionNode> expr1; … … 1175 1261 public: 1176 1262 LessNumbersNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1177 : LessNode(e1, e2) {}1263 : LessNode(e1, e2) {} 1178 1264 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1265 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1266 private: 1267 ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*); 1179 1268 }; 1180 1269 … … 1182 1271 public: 1183 1272 LessStringsNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1184 : LessNode(e1, e2) {}1273 : LessNode(e1, e2) {} 1185 1274 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1275 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1276 private: 1277 ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*); 1186 1278 }; 1187 1279 … … 1318 1410 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1319 1411 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1412 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1413 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1414 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1415 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1320 1416 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1321 1417 virtual Precedence precedence() const { return PrecBitwiseAnd; } 1322 1418 private: 1419 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1323 1420 RefPtr<ExpressionNode> expr1; 1324 1421 RefPtr<ExpressionNode> expr2; … … 1331 1428 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1332 1429 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1430 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1431 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1432 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1433 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1333 1434 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1334 1435 virtual Precedence precedence() const { return PrecBitwiseOr; } 1335 1436 private: 1437 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1336 1438 RefPtr<ExpressionNode> expr1; 1337 1439 RefPtr<ExpressionNode> expr2; … … 1344 1446 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1345 1447 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1448 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1449 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1450 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1451 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1346 1452 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1347 1453 virtual Precedence precedence() const { return PrecBitwiseXor; } 1348 1454 private: 1455 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1349 1456 RefPtr<ExpressionNode> expr1; 1350 1457 RefPtr<ExpressionNode> expr2; … … 1364 1471 virtual Precedence precedence() const { return PrecLogicalAnd; } 1365 1472 private: 1473 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1366 1474 RefPtr<ExpressionNode> expr1; 1367 1475 RefPtr<ExpressionNode> expr2; … … 1378 1486 virtual Precedence precedence() const { return PrecLogicalOr; } 1379 1487 private: 1488 ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*); 1380 1489 RefPtr<ExpressionNode> expr1; 1381 1490 RefPtr<ExpressionNode> expr2; … … 1392 1501 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1393 1502 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1503 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1504 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1505 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1394 1506 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1395 1507 virtual Precedence precedence() const { return PrecConditional; } … … 1567 1679 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1568 1680 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1681 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; 1682 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1683 virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL; 1684 virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL; 1569 1685 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1570 1686 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } -
trunk/JavaScriptCore/kjs/value.cpp
r27201 r27747 73 73 } 74 74 75 int32_t JSValue::toInt32SlowCase( ExecState* exec, bool& ok) const75 int32_t JSValue::toInt32SlowCase(double d, bool& ok) 76 76 { 77 77 ok = true; 78 78 79 double d = toNumber(exec);80 79 if (d >= -D32 / 2 && d < D32 / 2) 81 80 return static_cast<int32_t>(d); … … 94 93 } 95 94 96 uint32_t JSValue::toUInt32SlowCase(ExecState* exec, bool& ok) const 95 int32_t JSValue::toInt32SlowCase(ExecState* exec, bool& ok) const 96 { 97 return JSValue::toInt32SlowCase(toNumber(exec), ok); 98 } 99 100 uint32_t JSValue::toUInt32SlowCase(double d, bool& ok) 97 101 { 98 102 ok = true; 99 103 100 double d = toNumber(exec);101 104 if (d >= 0.0 && d < D32) 102 105 return static_cast<uint32_t>(d); … … 111 114 d32 += D32; 112 115 return static_cast<uint32_t>(d32); 116 } 117 118 uint32_t JSValue::toUInt32SlowCase(ExecState* exec, bool& ok) const 119 { 120 return JSValue::toUInt32SlowCase(toNumber(exec), ok); 113 121 } 114 122 -
trunk/JavaScriptCore/kjs/value.h
r27695 r27747 98 98 uint32_t toUInt32(ExecState*, bool& ok) const; 99 99 100 // These are identical logic to above, and faster than jsNumber(number)->toInt32(exec) 101 static int32_t toInt32(double); 102 static int32_t toUInt32(double); 103 100 104 // Floating point conversions. 101 105 float toFloat(ExecState*) const; … … 104 108 void mark(); 105 109 bool marked() const; 110 111 static int32_t toInt32SlowCase(double, bool& ok); 112 static uint32_t toUInt32SlowCase(double, bool& ok); 106 113 107 114 private: … … 289 296 } 290 297 291 inline JSCell *JSValue::asCell()298 ALWAYS_INLINE JSCell* JSValue::asCell() 292 299 { 293 300 ASSERT(!JSImmediate::isImmediate(this)); 294 return static_cast<JSCell 295 } 296 297 inline const JSCell *JSValue::asCell() const301 return static_cast<JSCell*>(this); 302 } 303 304 ALWAYS_INLINE const JSCell* JSValue::asCell() const 298 305 { 299 306 ASSERT(!JSImmediate::isImmediate(this)); 300 return static_cast<const JSCell 307 return static_cast<const JSCell*>(this); 301 308 } 302 309 … … 474 481 } 475 482 483 inline int32_t JSValue::toInt32(double val) 484 { 485 if (!(val >= -2147483648.0 && val < 2147483648.0)) { 486 bool ignored; 487 return toInt32SlowCase(val, ignored); 488 } 489 return static_cast<int32_t>(val); 490 } 491 492 inline int32_t JSValue::toUInt32(double val) 493 { 494 if (!(val >= 0.0 && val < 4294967296.0)) { 495 bool ignored; 496 return toUInt32SlowCase(val, ignored); 497 } 498 return static_cast<uint32_t>(val); 499 } 500 476 501 inline int32_t JSValue::toInt32(ExecState* exec, bool& ok) const 477 502 {
Note:
See TracChangeset
for help on using the changeset viewer.