Changeset 100195 in webkit
- Timestamp:
- Nov 14, 2011, 2:42:36 PM (15 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
wtf/text/StringImpl.cpp (modified) (15 diffs)
-
wtf/text/WTFString.cpp (modified) (5 diffs)
-
wtf/text/WTFString.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r100180 r100195 1 2011-11-14 Michael Saboff <msaboff@apple.com> 2 3 Towards 8 bit strings - Add 8 bit paths to StringImpl methods 4 https://bugs.webkit.org/show_bug.cgi?id=72290 5 6 Added 8 bit patchs to StringImpl to number and find methods. 7 8 Reviewed by Oliver Hunt. 9 10 * wtf/text/StringImpl.cpp: 11 (WTF::StringImpl::toIntStrict): 12 (WTF::StringImpl::toUIntStrict): 13 (WTF::StringImpl::toInt64Strict): 14 (WTF::StringImpl::toUInt64Strict): 15 (WTF::StringImpl::toIntPtrStrict): 16 (WTF::StringImpl::toInt): 17 (WTF::StringImpl::toUInt): 18 (WTF::StringImpl::toInt64): 19 (WTF::StringImpl::toUInt64): 20 (WTF::StringImpl::toIntPtr): 21 (WTF::StringImpl::toDouble): 22 (WTF::StringImpl::toFloat): 23 (WTF::StringImpl::find): 24 (WTF::StringImpl::reverseFind): 25 * wtf/text/WTFString.cpp: 26 (WTF::toIntegralType): 27 (WTF::lengthOfCharactersAsInteger): 28 (WTF::charactersToIntStrict): 29 (WTF::charactersToUIntStrict): 30 (WTF::charactersToInt64Strict): 31 (WTF::charactersToUInt64Strict): 32 (WTF::charactersToIntPtrStrict): 33 (WTF::charactersToInt): 34 (WTF::charactersToUInt): 35 (WTF::charactersToInt64): 36 (WTF::charactersToUInt64): 37 (WTF::charactersToIntPtr): 38 (WTF::toDoubleType): 39 (WTF::charactersToDouble): 40 (WTF::charactersToFloat): 41 * wtf/text/WTFString.h: 42 (WTF::find): 43 (WTF::reverseFind): 44 1 45 2011-11-14 Vincent Scheib <scheib@chromium.org> 2 46 -
trunk/Source/JavaScriptCore/wtf/text/StringImpl.cpp
r99072 r100195 612 612 int StringImpl::toIntStrict(bool* ok, int base) 613 613 { 614 if (is8Bit()) 615 return charactersToIntStrict(characters8(), m_length, ok, base); 614 616 return charactersToIntStrict(characters16(), m_length, ok, base); 615 617 } … … 617 619 unsigned StringImpl::toUIntStrict(bool* ok, int base) 618 620 { 621 if (is8Bit()) 622 return charactersToUIntStrict(characters8(), m_length, ok, base); 619 623 return charactersToUIntStrict(characters16(), m_length, ok, base); 620 624 } … … 622 626 int64_t StringImpl::toInt64Strict(bool* ok, int base) 623 627 { 628 if (is8Bit()) 629 return charactersToInt64Strict(characters8(), m_length, ok, base); 624 630 return charactersToInt64Strict(characters16(), m_length, ok, base); 625 626 631 } 627 632 628 633 uint64_t StringImpl::toUInt64Strict(bool* ok, int base) 629 634 { 635 if (is8Bit()) 636 return charactersToUInt64Strict(characters8(), m_length, ok, base); 630 637 return charactersToUInt64Strict(characters16(), m_length, ok, base); 631 638 } … … 633 640 intptr_t StringImpl::toIntPtrStrict(bool* ok, int base) 634 641 { 642 if (is8Bit()) 643 return charactersToIntPtrStrict(characters8(), m_length, ok, base); 635 644 return charactersToIntPtrStrict(characters16(), m_length, ok, base); 636 645 } … … 638 647 int StringImpl::toInt(bool* ok) 639 648 { 649 if (is8Bit()) 650 return charactersToInt(characters8(), m_length, ok); 640 651 return charactersToInt(characters16(), m_length, ok); 641 652 } … … 643 654 unsigned StringImpl::toUInt(bool* ok) 644 655 { 656 if (is8Bit()) 657 return charactersToUInt(characters8(), m_length, ok); 645 658 return charactersToUInt(characters16(), m_length, ok); 646 659 } … … 648 661 int64_t StringImpl::toInt64(bool* ok) 649 662 { 663 if (is8Bit()) 664 return charactersToInt64(characters8(), m_length, ok); 650 665 return charactersToInt64(characters16(), m_length, ok); 651 666 } … … 653 668 uint64_t StringImpl::toUInt64(bool* ok) 654 669 { 670 if (is8Bit()) 671 return charactersToUInt64(characters8(), m_length, ok); 655 672 return charactersToUInt64(characters16(), m_length, ok); 656 673 } … … 658 675 intptr_t StringImpl::toIntPtr(bool* ok) 659 676 { 677 if (is8Bit()) 678 return charactersToIntPtr(characters8(), m_length, ok); 660 679 return charactersToIntPtr(characters16(), m_length, ok); 661 662 680 } 663 681 664 682 double StringImpl::toDouble(bool* ok, bool* didReadNumber) 665 683 { 684 if (is8Bit()) 685 return charactersToDouble(characters8(), m_length, ok, didReadNumber); 666 686 return charactersToDouble(characters16(), m_length, ok, didReadNumber); 667 687 } … … 669 689 float StringImpl::toFloat(bool* ok, bool* didReadNumber) 670 690 { 691 if (is8Bit()) 692 return charactersToFloat(characters8(), m_length, ok, didReadNumber); 671 693 return charactersToFloat(characters16(), m_length, ok, didReadNumber); 672 694 } … … 724 746 size_t StringImpl::find(UChar c, unsigned start) 725 747 { 748 if (is8Bit()) 749 return WTF::find(characters8(), m_length, c, start); 726 750 return WTF::find(characters16(), m_length, c, start); 727 751 } … … 729 753 size_t StringImpl::find(CharacterMatchFunctionPtr matchFunction, unsigned start) 730 754 { 755 if (is8Bit()) 756 return WTF::find(characters8(), m_length, matchFunction, start); 731 757 return WTF::find(characters16(), m_length, matchFunction, start); 732 758 } … … 823 849 824 850 // Optimization 1: fast case for strings of length 1. 825 if (matchLength == 1) 826 return WTF::find(characters16(), length(), matchString->characters16()[0], index); 851 if (matchLength == 1) { 852 if (is8Bit() && matchString->is8Bit()) 853 return WTF::find(characters8(), length(), matchString->characters8()[0], index); 854 return WTF::find(characters(), length(), matchString->characters()[0], index); 855 } 827 856 828 857 // Check index & matchLength are in range. … … 892 921 size_t StringImpl::reverseFind(UChar c, unsigned index) 893 922 { 923 if (is8Bit()) 924 return WTF::reverseFind(characters8(), m_length, c, index); 894 925 return WTF::reverseFind(characters16(), m_length, c, index); 895 926 } … … 905 936 906 937 // Optimization 1: fast case for strings of length 1. 907 if (matchLength == 1) 908 return WTF::reverseFind(characters16(), length(), matchString->characters()[0], index); 938 if (matchLength == 1) { 939 if (is8Bit() && matchString->is8Bit()) 940 return WTF::reverseFind(characters8(), length(), matchString->characters8()[0], index); 941 return WTF::reverseFind(characters(), length(), matchString->characters()[0], index); 942 } 909 943 910 944 // Check index & matchLength are in range. -
trunk/Source/JavaScriptCore/wtf/text/WTFString.cpp
r98624 r100195 789 789 } 790 790 791 template <typename IntegralType >792 static inline IntegralType toIntegralType(const UChar* data, size_t length, bool* ok, int base)791 template <typename IntegralType, typename CharType> 792 static inline IntegralType toIntegralType(const CharType* data, size_t length, bool* ok, int base) 793 793 { 794 794 static const IntegralType integralMax = numeric_limits<IntegralType>::max(); … … 824 824 length--; 825 825 IntegralType digitValue; 826 UCharc = *data;826 CharType c = *data; 827 827 if (isASCIIDigit(c)) 828 828 digitValue = c - '0'; … … 865 865 } 866 866 867 static unsigned lengthOfCharactersAsInteger(const UChar* data, size_t length) 867 template <typename CharType> 868 static unsigned lengthOfCharactersAsInteger(const CharType* data, size_t length) 868 869 { 869 870 size_t i = 0; … … 888 889 } 889 890 891 int charactersToIntStrict(const LChar* data, size_t length, bool* ok, int base) 892 { 893 return toIntegralType<int, LChar>(data, length, ok, base); 894 } 895 890 896 int charactersToIntStrict(const UChar* data, size_t length, bool* ok, int base) 891 897 { 892 return toIntegralType<int>(data, length, ok, base); 898 return toIntegralType<int, UChar>(data, length, ok, base); 899 } 900 901 unsigned charactersToUIntStrict(const LChar* data, size_t length, bool* ok, int base) 902 { 903 return toIntegralType<unsigned, LChar>(data, length, ok, base); 893 904 } 894 905 895 906 unsigned charactersToUIntStrict(const UChar* data, size_t length, bool* ok, int base) 896 907 { 897 return toIntegralType<unsigned>(data, length, ok, base); 908 return toIntegralType<unsigned, UChar>(data, length, ok, base); 909 } 910 911 int64_t charactersToInt64Strict(const LChar* data, size_t length, bool* ok, int base) 912 { 913 return toIntegralType<int64_t, LChar>(data, length, ok, base); 898 914 } 899 915 900 916 int64_t charactersToInt64Strict(const UChar* data, size_t length, bool* ok, int base) 901 917 { 902 return toIntegralType<int64_t>(data, length, ok, base); 918 return toIntegralType<int64_t, UChar>(data, length, ok, base); 919 } 920 921 uint64_t charactersToUInt64Strict(const LChar* data, size_t length, bool* ok, int base) 922 { 923 return toIntegralType<uint64_t, LChar>(data, length, ok, base); 903 924 } 904 925 905 926 uint64_t charactersToUInt64Strict(const UChar* data, size_t length, bool* ok, int base) 906 927 { 907 return toIntegralType<uint64_t>(data, length, ok, base); 928 return toIntegralType<uint64_t, UChar>(data, length, ok, base); 929 } 930 931 intptr_t charactersToIntPtrStrict(const LChar* data, size_t length, bool* ok, int base) 932 { 933 return toIntegralType<intptr_t, LChar>(data, length, ok, base); 908 934 } 909 935 910 936 intptr_t charactersToIntPtrStrict(const UChar* data, size_t length, bool* ok, int base) 911 937 { 912 return toIntegralType<intptr_t>(data, length, ok, base); 938 return toIntegralType<intptr_t, UChar>(data, length, ok, base); 939 } 940 941 int charactersToInt(const LChar* data, size_t length, bool* ok) 942 { 943 return toIntegralType<int, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); 913 944 } 914 945 915 946 int charactersToInt(const UChar* data, size_t length, bool* ok) 916 947 { 917 return toIntegralType<int>(data, lengthOfCharactersAsInteger(data, length), ok, 10); 948 return toIntegralType<int, UChar>(data, lengthOfCharactersAsInteger(data, length), ok, 10); 949 } 950 951 unsigned charactersToUInt(const LChar* data, size_t length, bool* ok) 952 { 953 return toIntegralType<unsigned, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); 918 954 } 919 955 920 956 unsigned charactersToUInt(const UChar* data, size_t length, bool* ok) 921 957 { 922 return toIntegralType<unsigned>(data, lengthOfCharactersAsInteger(data, length), ok, 10); 958 return toIntegralType<unsigned, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10); 959 } 960 961 int64_t charactersToInt64(const LChar* data, size_t length, bool* ok) 962 { 963 return toIntegralType<int64_t, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); 923 964 } 924 965 925 966 int64_t charactersToInt64(const UChar* data, size_t length, bool* ok) 926 967 { 927 return toIntegralType<int64_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10); 968 return toIntegralType<int64_t, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10); 969 } 970 971 uint64_t charactersToUInt64(const LChar* data, size_t length, bool* ok) 972 { 973 return toIntegralType<uint64_t, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); 928 974 } 929 975 930 976 uint64_t charactersToUInt64(const UChar* data, size_t length, bool* ok) 931 977 { 932 return toIntegralType<uint64_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10); 978 return toIntegralType<uint64_t, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10); 979 } 980 981 intptr_t charactersToIntPtr(const LChar* data, size_t length, bool* ok) 982 { 983 return toIntegralType<intptr_t, LChar>(data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); 933 984 } 934 985 935 986 intptr_t charactersToIntPtr(const UChar* data, size_t length, bool* ok) 936 987 { 937 return toIntegralType<intptr_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10); 938 } 939 940 double charactersToDouble(const UChar* data, size_t length, bool* ok, bool* didReadNumber) 988 return toIntegralType<intptr_t, UChar>(data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10); 989 } 990 991 template <typename CharType> 992 static inline double toDoubleType(const CharType* data, size_t length, bool* ok, bool* didReadNumber) 941 993 { 942 994 if (!length) { … … 962 1014 } 963 1015 1016 double charactersToDouble(const LChar* data, size_t length, bool* ok, bool* didReadNumber) 1017 { 1018 return toDoubleType<LChar>(data, length, ok, didReadNumber); 1019 } 1020 1021 double charactersToDouble(const UChar* data, size_t length, bool* ok, bool* didReadNumber) 1022 { 1023 return toDoubleType<UChar>(data, length, ok, didReadNumber); 1024 } 1025 1026 float charactersToFloat(const LChar* data, size_t length, bool* ok, bool* didReadNumber) 1027 { 1028 // FIXME: This will return ok even when the string fits into a double but not a float. 1029 return static_cast<float>(toDoubleType<LChar>(data, length, ok, didReadNumber)); 1030 } 1031 964 1032 float charactersToFloat(const UChar* data, size_t length, bool* ok, bool* didReadNumber) 965 1033 { 966 1034 // FIXME: This will return ok even when the string fits into a double but not a float. 967 return static_cast<float>( charactersToDouble(data, length, ok, didReadNumber));1035 return static_cast<float>(toDoubleType<UChar>(data, length, ok, didReadNumber)); 968 1036 } 969 1037 -
trunk/Source/JavaScriptCore/wtf/text/WTFString.h
r99128 r100195 56 56 bool charactersAreAllASCII(const UChar*, size_t); 57 57 bool charactersAreAllLatin1(const UChar*, size_t); 58 WTF_EXPORT_PRIVATE int charactersToIntStrict(const LChar*, size_t, bool* ok = 0, int base = 10); 58 59 WTF_EXPORT_PRIVATE int charactersToIntStrict(const UChar*, size_t, bool* ok = 0, int base = 10); 60 WTF_EXPORT_PRIVATE unsigned charactersToUIntStrict(const LChar*, size_t, bool* ok = 0, int base = 10); 59 61 WTF_EXPORT_PRIVATE unsigned charactersToUIntStrict(const UChar*, size_t, bool* ok = 0, int base = 10); 62 int64_t charactersToInt64Strict(const LChar*, size_t, bool* ok = 0, int base = 10); 60 63 int64_t charactersToInt64Strict(const UChar*, size_t, bool* ok = 0, int base = 10); 64 uint64_t charactersToUInt64Strict(const LChar*, size_t, bool* ok = 0, int base = 10); 61 65 uint64_t charactersToUInt64Strict(const UChar*, size_t, bool* ok = 0, int base = 10); 66 intptr_t charactersToIntPtrStrict(const LChar*, size_t, bool* ok = 0, int base = 10); 62 67 intptr_t charactersToIntPtrStrict(const UChar*, size_t, bool* ok = 0, int base = 10); 63 68 69 int charactersToInt(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage 64 70 int charactersToInt(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage 71 unsigned charactersToUInt(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage 65 72 unsigned charactersToUInt(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage 73 int64_t charactersToInt64(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage 66 74 int64_t charactersToInt64(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage 75 uint64_t charactersToUInt64(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage 67 76 uint64_t charactersToUInt64(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage 77 intptr_t charactersToIntPtr(const LChar*, size_t, bool* ok = 0); // ignores trailing garbage 68 78 intptr_t charactersToIntPtr(const UChar*, size_t, bool* ok = 0); // ignores trailing garbage 69 79 80 WTF_EXPORT_PRIVATE double charactersToDouble(const LChar*, size_t, bool* ok = 0, bool* didReadNumber = 0); 70 81 WTF_EXPORT_PRIVATE double charactersToDouble(const UChar*, size_t, bool* ok = 0, bool* didReadNumber = 0); 82 float charactersToFloat(const LChar*, size_t, bool* ok = 0, bool* didReadNumber = 0); 71 83 float charactersToFloat(const UChar*, size_t, bool* ok = 0, bool* didReadNumber = 0); 72 84 … … 410 422 WTF_EXPORT_PRIVATE int codePointCompare(const String&, const String&); 411 423 412 inline size_t find(const UChar* characters, unsigned length, UChar matchCharacter, unsigned index = 0)424 inline size_t find(const LChar* characters, unsigned length, LChar matchCharacter, unsigned index = 0) 413 425 { 414 426 while (index < length) { … … 420 432 } 421 433 422 inline size_t find(const UChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0) 434 inline size_t find(const UChar* characters, unsigned length, UChar matchCharacter, unsigned index = 0) 435 { 436 while (index < length) { 437 if (characters[index] == matchCharacter) 438 return index; 439 ++index; 440 } 441 return notFound; 442 } 443 444 inline size_t find(const LChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0) 423 445 { 424 446 while (index < length) { … … 428 450 } 429 451 return notFound; 452 } 453 454 inline size_t find(const UChar* characters, unsigned length, CharacterMatchFunctionPtr matchFunction, unsigned index = 0) 455 { 456 while (index < length) { 457 if (matchFunction(characters[index])) 458 return index; 459 ++index; 460 } 461 return notFound; 462 } 463 464 inline size_t reverseFind(const LChar* characters, unsigned length, LChar matchCharacter, unsigned index = UINT_MAX) 465 { 466 if (!length) 467 return notFound; 468 if (index >= length) 469 index = length - 1; 470 while (characters[index] != matchCharacter) { 471 if (!index--) 472 return notFound; 473 } 474 return index; 430 475 } 431 476
Note:
See TracChangeset
for help on using the changeset viewer.