Changeset 27095 in webkit for trunk/JavaScriptCore/kjs/string_object.cpp
- Timestamp:
- Oct 26, 2007, 12:51:25 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/string_object.cpp
r27011 r27095 458 458 break; 459 459 case CharAt: 460 // Other browsers treat an omitted parameter as 0 rather than NaN. 461 // That doesn't match the ECMA standard, but is needed for site compatibility. 462 dpos = a0->isUndefined() ? 0 : a0->toInteger(exec); 463 if (dpos >= 0 && dpos < len) // false for NaN 460 dpos = a0->toInteger(exec); 461 if (dpos >= 0 && dpos < len) 464 462 u = s.substr(static_cast<int>(dpos), 1); 465 463 else … … 468 466 break; 469 467 case CharCodeAt: 470 // Other browsers treat an omitted parameter as 0 rather than NaN. 471 // That doesn't match the ECMA standard, but is needed for site compatibility. 472 dpos = a0->isUndefined() ? 0 : a0->toInteger(exec); 473 if (dpos >= 0 && dpos < len) // false for NaN 468 dpos = a0->toInteger(exec); 469 if (dpos >= 0 && dpos < len) 474 470 result = jsNumber(s[static_cast<int>(dpos)].unicode()); 475 471 else … … 486 482 case IndexOf: 487 483 u2 = a0->toString(exec); 488 if (a1->isUndefined()) 484 dpos = a1->toInteger(exec); 485 if (dpos < 0) 489 486 dpos = 0; 490 else { 491 dpos = a1->toInteger(exec); 492 if (dpos >= 0) { // false for NaN 493 if (dpos > len) 494 dpos = len; 495 } else 496 dpos = 0; 497 } 487 else if (dpos > len) 488 dpos = len; 498 489 result = jsNumber(s.find(u2, static_cast<int>(dpos))); 499 490 break; … … 501 492 u2 = a0->toString(exec); 502 493 d = a1->toNumber(exec); 503 if (a1->isUndefined() || KJS::isNaN(d)) 494 dpos = a1->toIntegerPreserveNaN(exec); 495 if (dpos < 0) 496 dpos = 0; 497 else if (!(dpos <= len)) // true for NaN 504 498 dpos = len; 505 else {506 dpos = a1->toInteger(exec);507 if (dpos >= 0) { // false for NaN508 if (dpos > len)509 dpos = len;510 } else511 dpos = 0;512 }513 499 result = jsNumber(s.rfind(u2, static_cast<int>(dpos))); 514 500 break; … … 659 645 break; 660 646 case Substr: { 661 double d = a0->toInteger(exec); 662 double d2 = a1->toInteger(exec); 663 if (!(d >= 0)) { // true for NaN 664 d += len; 665 if (!(d >= 0)) // true for NaN 666 d = 0; 667 } 668 if (isNaN(d2)) 669 d2 = len - d; 670 else { 671 if (d2 < 0) 672 d2 = 0; 673 if (d2 > len - d) 674 d2 = len - d; 675 } 676 result = jsString(s.substr(static_cast<int>(d), static_cast<int>(d2))); 647 double start = a0->toInteger(exec); 648 double length = a1->isUndefined() ? len : a1->toInteger(exec); 649 if (start >= len) 650 return jsString(""); 651 if (length < 0) 652 return jsString(""); 653 if (start < 0) { 654 start += len; 655 if (start < 0) 656 start = 0; 657 } 658 if (length > len - d) 659 length = len - d; 660 result = jsString(s.substr(static_cast<int>(start), static_cast<int>(length))); 677 661 break; 678 662 } … … 853 837 ListIterator it = args.begin(); 854 838 while (it != args.end()) { 855 unsigned short u = it->toUInt 16(exec);839 unsigned short u = it->toUInt32(exec); 856 840 *p++ = UChar(u); 857 841 it++;
Note:
See TracChangeset
for help on using the changeset viewer.