Changeset 106257 in webkit


Ignore:
Timestamp:
Jan 30, 2012 10:51:36 AM (12 years ago)
Author:
msaboff@apple.com
Message:

stringProtoFuncReplace converts 8 bit strings to 16 bit during replacement
https://bugs.webkit.org/show_bug.cgi?id=76651

Reviewed by Geoffrey Garen.

Made local function substituteBackreferencesSlow a template function
based on character width. Cleaned up getCharacters() in both UString
and StringImpl. Changed getCharacters<UChar> to up convert an 8 bit
string to 16 bits if necessary.

  • runtime/StringPrototype.cpp:

(JSC::substituteBackreferencesSlow):
(JSC::substituteBackreferences):

  • runtime/UString.h:

(JSC::LChar):
(JSC::UChar):

  • wtf/text/StringImpl.h:

(WTF::UChar):

Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r106255 r106257  
     12012-01-30  Michael Saboff  <msaboff@apple.com>
     2
     3        stringProtoFuncReplace converts 8 bit strings to 16 bit during replacement
     4        https://bugs.webkit.org/show_bug.cgi?id=76651
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Made local function substituteBackreferencesSlow a template function
     9        based on character width.  Cleaned up getCharacters() in both UString
     10        and StringImpl.  Changed getCharacters<UChar> to up convert an 8 bit
     11        string to 16 bits if necessary.
     12
     13        * runtime/StringPrototype.cpp:
     14        (JSC::substituteBackreferencesSlow):
     15        (JSC::substituteBackreferences):
     16        * runtime/UString.h:
     17        (JSC::LChar):
     18        (JSC::UChar):
     19        * wtf/text/StringImpl.h:
     20        (WTF::UChar):
     21
    1222012-01-30  Gavin Barraclough  <barraclough@apple.com>
    223
  • trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp

    r106170 r106257  
    171171}
    172172
     173template <typename CharType>
    173174static NEVER_INLINE UString substituteBackreferencesSlow(const UString& replacement, const UString& source, const int* ovector, RegExp* reg, size_t i)
    174175{
    175     Vector<UChar> substitutedReplacement;
     176    Vector<CharType> substitutedReplacement;
    176177    int offset = 0;
    177178    do {
     
    183184            // "$$" -> "$"
    184185            ++i;
    185             substitutedReplacement.append(replacement.characters() + offset, i - offset);
     186            substitutedReplacement.append(replacement.getCharacters<CharType>() + offset, i - offset);
    186187            offset = i + 1;
    187188            continue;
     
    223224
    224225        if (i - offset)
    225             substitutedReplacement.append(replacement.characters() + offset, i - offset);
     226            substitutedReplacement.append(replacement.getCharacters<CharType>() + offset, i - offset);
    226227        i += 1 + advance;
    227228        offset = i + 1;
    228229        if (backrefStart >= 0)
    229             substitutedReplacement.append(source.characters() + backrefStart, backrefLength);
     230            substitutedReplacement.append(source.getCharacters<CharType>() + backrefStart, backrefLength);
    230231    } while ((i = replacement.find('$', i + 1)) != notFound);
    231232
    232233    if (replacement.length() - offset)
    233         substitutedReplacement.append(replacement.characters() + offset, replacement.length() - offset);
     234        substitutedReplacement.append(replacement.getCharacters<CharType>() + offset, replacement.length() - offset);
    234235
    235236    substitutedReplacement.shrinkToFit();
     
    240241{
    241242    size_t i = replacement.find('$', 0);
    242     if (UNLIKELY(i != notFound))
    243         return substituteBackreferencesSlow(replacement, source, ovector, reg, i);
     243    if (UNLIKELY(i != notFound)) {
     244        if (replacement.is8Bit() && source.is8Bit())
     245            return substituteBackreferencesSlow<LChar>(replacement, source, ovector, reg, i);
     246        return substituteBackreferencesSlow<UChar>(replacement, source, ovector, reg, i);
     247    }
    244248    return replacement;
    245249}
  • trunk/Source/JavaScriptCore/runtime/UString.h

    r104900 r106257  
    140140
    141141template<>
    142 inline const LChar* UString::getCharacters<LChar>() const
    143 {
    144     ASSERT(is8Bit());
    145     return characters8();
    146 }
     142inline const LChar* UString::getCharacters<LChar>() const { return characters8(); }
    147143
    148144template<>
    149 inline const UChar* UString::getCharacters<UChar>() const
    150 {
    151     ASSERT(!is8Bit());
    152     return characters16();
    153 }
     145inline const UChar* UString::getCharacters<UChar>() const { return characters(); }
    154146
    155147NEVER_INLINE bool equalSlowCase(const UString& s1, const UString& s2);
  • trunk/Source/JavaScriptCore/wtf/text/StringImpl.h

    r106019 r106257  
    551551
    552552template <>
    553 ALWAYS_INLINE const UChar* StringImpl::getCharacters<UChar>() const { return characters16(); }
     553ALWAYS_INLINE const UChar* StringImpl::getCharacters<UChar>() const { return characters(); }
    554554
    555555WTF_EXPORT_PRIVATE bool equal(const StringImpl*, const StringImpl*);
Note: See TracChangeset for help on using the changeset viewer.