Changeset 27747 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp
- Timestamp:
- Nov 13, 2007, 12:02:44 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.