Changeset 152201 in webkit


Ignore:
Timestamp:
Jun 28, 2013 6:39:28 PM (11 years ago)
Author:
andersca@apple.com
Message:

Remove String::deprecatedCharactersWithNullTermination() and related code
https://bugs.webkit.org/show_bug.cgi?id=118211

Reviewed by Benjamin Poulain.

Source/JavaScriptCore:

  • API/JSStringRef.cpp:

(JSStringCreateWithCharactersNoCopy):
Update call to StringImpl::createWithoutCopying.

Source/WTF:

Remove String::deprecatedCharactersWithNullTermination, StringImpl::createWithTerminatingNullCharacter
and the s_hashFlagHasTerminatingNullCharacter flag. We no longer care about whether strings have a
terminating null character.

  • wtf/text/StringImpl.cpp:

(WTF::StringImpl::createFromLiteral):
(WTF::StringImpl::createWithoutCopying):
(WTF::StringImpl::getData16SlowCase):
(WTF::StringImpl::sizeInBytes):

  • wtf/text/StringImpl.h:

(WTF::StringImpl::StringImpl):
(WTF::StringImpl::createFromLiteral):
(WTF::StringImpl::isolatedCopy):

  • wtf/text/WTFString.cpp:
  • wtf/text/WTFString.h:

Tools:

Remove all hasTerminatingNullCharacter() checks.

  • TestWebKitAPI/Tests/WTF/AtomicString.cpp:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WTF/StringImpl.cpp:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WTF/WTFString.cpp:

(TestWebKitAPI::TEST):

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/JSStringRef.cpp

    r152052 r152201  
    6464{
    6565    initializeThreading();
    66     return OpaqueJSString::create(StringImpl::createWithoutCopying(chars, numChars, WTF::DoesNotHaveTerminatingNullCharacter)).leakRef();
     66    return OpaqueJSString::create(StringImpl::createWithoutCopying(chars, numChars)).leakRef();
    6767}
    6868
  • trunk/Source/JavaScriptCore/ChangeLog

    r152091 r152201  
     12013-06-28  Anders Carlsson  <andersca@apple.com>
     2
     3        Remove String::deprecatedCharactersWithNullTermination() and related code
     4        https://bugs.webkit.org/show_bug.cgi?id=118211
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        * API/JSStringRef.cpp:
     9        (JSStringCreateWithCharactersNoCopy):
     10        Update call to StringImpl::createWithoutCopying.
     11
    1122013-06-27  Timothy Hatcher  <timothy@apple.com>
    213
  • trunk/Source/WTF/ChangeLog

    r152142 r152201  
     12013-06-28  Anders Carlsson  <andersca@apple.com>
     2
     3        Remove String::deprecatedCharactersWithNullTermination() and related code
     4        https://bugs.webkit.org/show_bug.cgi?id=118211
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        Remove String::deprecatedCharactersWithNullTermination, StringImpl::createWithTerminatingNullCharacter
     9        and the s_hashFlagHasTerminatingNullCharacter flag. We no longer care about whether strings have a
     10        terminating null character.
     11
     12        * wtf/text/StringImpl.cpp:
     13        (WTF::StringImpl::createFromLiteral):
     14        (WTF::StringImpl::createWithoutCopying):
     15        (WTF::StringImpl::getData16SlowCase):
     16        (WTF::StringImpl::sizeInBytes):
     17        * wtf/text/StringImpl.h:
     18        (WTF::StringImpl::StringImpl):
     19        (WTF::StringImpl::createFromLiteral):
     20        (WTF::StringImpl::isolatedCopy):
     21        * wtf/text/WTFString.cpp:
     22        * wtf/text/WTFString.h:
     23
    1242013-06-27  Anders Carlsson  <andersca@apple.com>
    225
  • trunk/Source/WTF/wtf/text/StringImpl.cpp

    r152052 r152201  
    159159    ASSERT_WITH_MESSAGE(length, "Use StringImpl::empty() to create an empty string");
    160160    ASSERT(charactersAreAllASCII<LChar>(reinterpret_cast<const LChar*>(characters), length));
    161     return adoptRef(new StringImpl(reinterpret_cast<const LChar*>(characters), length, DoesHaveTerminatingNullCharacter, ConstructWithoutCopying));
     161    return adoptRef(new StringImpl(reinterpret_cast<const LChar*>(characters), length, ConstructWithoutCopying));
    162162}
    163163
     
    167167}
    168168
    169 PassRefPtr<StringImpl> StringImpl::createWithoutCopying(const UChar* characters, unsigned length, HasTerminatingNullCharacter hasTerminatingNullCharacter)
     169PassRefPtr<StringImpl> StringImpl::createWithoutCopying(const UChar* characters, unsigned length)
    170170{
    171171    if (!length)
    172172        return empty();
    173173
    174     return adoptRef(new StringImpl(characters, length, hasTerminatingNullCharacter, ConstructWithoutCopying));
    175 }
    176 
    177 PassRefPtr<StringImpl> StringImpl::createWithoutCopying(const LChar* characters, unsigned length, HasTerminatingNullCharacter hasTerminatingNullCharacter)
     174    return adoptRef(new StringImpl(characters, length, ConstructWithoutCopying));
     175}
     176
     177PassRefPtr<StringImpl> StringImpl::createWithoutCopying(const LChar* characters, unsigned length)
    178178{
    179179    if (!length)
    180180        return empty();
    181181
    182     return adoptRef(new StringImpl(characters, length, hasTerminatingNullCharacter, ConstructWithoutCopying));
     182    return adoptRef(new StringImpl(characters, length, ConstructWithoutCopying));
    183183}
    184184
     
    334334   
    335335    unsigned len = length();
    336     if (hasTerminatingNullCharacter())
    337         ++len;
    338336
    339337    m_copyData16 = static_cast<UChar*>(fastMalloc(len * sizeof(UChar)));
     
    19561954#endif
    19571955
    1958 PassRefPtr<StringImpl> StringImpl::createWithTerminatingNullCharacter(const StringImpl& string)
    1959 {
    1960     // Use createUninitialized instead of 'new StringImpl' so that the string and its buffer
    1961     // get allocated in a single memory block.
    1962     unsigned length = string.m_length;
    1963     if (length >= numeric_limits<unsigned>::max())
    1964         CRASH();
    1965     RefPtr<StringImpl> terminatedString;
    1966     if (string.is8Bit()) {
    1967         LChar* data;
    1968         terminatedString = createUninitialized(length + 1, data);
    1969         memcpy(data, string.m_data8, length * sizeof(LChar));
    1970         data[length] = 0;
    1971     } else {
    1972         UChar* data;
    1973         terminatedString = createUninitialized(length + 1, data);
    1974         memcpy(data, string.m_data16, length * sizeof(UChar));
    1975         data[length] = 0;
    1976     }
    1977     --(terminatedString->m_length);
    1978     terminatedString->m_hashAndFlags = (string.m_hashAndFlags & (~s_flagMask | s_hashFlag8BitBuffer)) | s_hashFlagHasTerminatingNullCharacter;
    1979     return terminatedString.release();
    1980 }
    1981 
    19821956size_t StringImpl::sizeInBytes() const
    19831957{
     
    19871961        if (has16BitShadow()) {
    19881962            size += 2 * size;
    1989             if (hasTerminatingNullCharacter())
    1990                 size += 2;
    19911963        }
    19921964    } else
  • trunk/Source/WTF/wtf/text/StringImpl.h

    r152052 r152201  
    7373    TextCaseInsensitive
    7474};
    75 
    76 enum HasTerminatingNullCharacter {
    77     DoesNotHaveTerminatingNullCharacter,
    78     DoesHaveTerminatingNullCharacter,
    79 };
    80 
    8175
    8276typedef bool (*CharacterMatchFunctionPtr)(UChar);
     
    250244
    251245    enum ConstructWithoutCopyingTag { ConstructWithoutCopying };
    252     StringImpl(const UChar* characters, unsigned length, HasTerminatingNullCharacter hasTerminatingNullCharacter, ConstructWithoutCopyingTag)
     246    StringImpl(const UChar* characters, unsigned length, ConstructWithoutCopyingTag)
    253247        : m_refCount(s_refCountIncrement)
    254248        , m_length(length)
    255249        , m_data16(characters)
    256250        , m_buffer(0)
    257         , m_hashAndFlags(BufferInternal | (hasTerminatingNullCharacter ? s_hashFlagHasTerminatingNullCharacter : 0))
     251        , m_hashAndFlags(BufferInternal)
    258252    {
    259253        ASSERT(m_data16);
    260254        ASSERT(m_length);
    261         ASSERT(!(m_hashAndFlags & s_hashFlagHasTerminatingNullCharacter) || !characters[length]);
    262255
    263256        STRING_STATS_ADD_16BIT_STRING(0);
    264257    }
    265258
    266     StringImpl(const LChar* characters, unsigned length, HasTerminatingNullCharacter hasTerminatingNullCharacter, ConstructWithoutCopyingTag)
     259    StringImpl(const LChar* characters, unsigned length, ConstructWithoutCopyingTag)
    267260        : m_refCount(s_refCountIncrement)
    268261        , m_length(length)
    269262        , m_data8(characters)
    270263        , m_buffer(0)
    271         , m_hashAndFlags(s_hashFlag8BitBuffer | BufferInternal | (hasTerminatingNullCharacter ? s_hashFlagHasTerminatingNullCharacter : 0))
     264        , m_hashAndFlags(s_hashFlag8BitBuffer | BufferInternal)
    272265    {
    273266        ASSERT(m_data8);
    274267        ASSERT(m_length);
    275         ASSERT(!(m_hashAndFlags & s_hashFlagHasTerminatingNullCharacter) || !characters[length]);
    276268
    277269        STRING_STATS_ADD_8BIT_STRING(0);
     
    422414        COMPILE_ASSERT((charactersCount - 1 <= ((unsigned(~0) - sizeof(StringImpl)) / sizeof(LChar))), StringImplFromLiteralCannotOverflow);
    423415
    424         return createWithoutCopying(reinterpret_cast<const LChar*>(characters), charactersCount - 1, DoesHaveTerminatingNullCharacter);
     416        return createWithoutCopying(reinterpret_cast<const LChar*>(characters), charactersCount - 1);
    425417    }
    426418
     
    429421    WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createFromLiteral(const char* characters);
    430422
    431     WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createWithoutCopying(const UChar* characters, unsigned length, HasTerminatingNullCharacter);
    432     WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createWithoutCopying(const LChar* characters, unsigned length, HasTerminatingNullCharacter);
     423    WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createWithoutCopying(const UChar* characters, unsigned length);
     424    WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createWithoutCopying(const LChar* characters, unsigned length);
    433425
    434426    WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createUninitialized(unsigned length, LChar*& data);
     
    472464    static unsigned flagIs8Bit() { return s_hashFlag8BitBuffer; }
    473465    static unsigned dataOffset() { return OBJECT_OFFSETOF(StringImpl, m_data8); }
    474     static PassRefPtr<StringImpl> createWithTerminatingNullCharacter(const StringImpl&);
    475466
    476467    template<typename CharType, size_t inlineCapacity, typename OverflowHandler>
     
    541532        return !length() && !isStatic();
    542533    }
    543 
    544     bool hasTerminatingNullCharacter() const { return m_hashAndFlags & s_hashFlagHasTerminatingNullCharacter; }
    545534
    546535    bool isAtomic() const { return m_hashAndFlags & s_hashFlagIsAtomic; }
     
    789778    static const unsigned s_refCountIncrement = 0x2; // This allows us to ref / deref without disturbing the static string flag.
    790779
    791     // The bottom 8 bits in the hash are flags.
    792     static const unsigned s_flagCount = 8;
     780    // The bottom 7 bits in the hash are flags.
     781    static const unsigned s_flagCount = 7;
    793782    static const unsigned s_flagMask = (1u << s_flagCount) - 1;
    794     COMPILE_ASSERT(s_flagCount == StringHasher::flagCount, StringHasher_reserves_enough_bits_for_StringImpl_flags);
    795 
    796     static const unsigned s_hashFlagHas16BitShadow = 1u << 7;
    797     static const unsigned s_hashFlag8BitBuffer = 1u << 6;
    798     static const unsigned s_hashFlagHasTerminatingNullCharacter = 1u << 5;
     783    COMPILE_ASSERT(s_flagCount <= StringHasher::flagCount, StringHasher_reserves_enough_bits_for_StringImpl_flags);
     784
     785    static const unsigned s_hashFlagHas16BitShadow = 1u << 6;
     786    static const unsigned s_hashFlag8BitBuffer = 1u << 5;
    799787    static const unsigned s_hashFlagIsAtomic = 1u << 4;
    800788    static const unsigned s_hashFlagDidReportCost = 1u << 3;
     
    817805        // These values mimic ConstructFromLiteral.
    818806        static const unsigned s_initialRefCount = s_refCountIncrement;
    819         static const unsigned s_initialFlags = s_hashFlag8BitBuffer | BufferInternal | s_hashFlagHasTerminatingNullCharacter;
     807        static const unsigned s_initialFlags = s_hashFlag8BitBuffer | BufferInternal;
    820808        static const unsigned s_hashShift = s_flagCount;
    821809    };
     
    13631351    if (!requiresCopy()) {
    13641352        if (is8Bit())
    1365             return StringImpl::createWithoutCopying(m_data8, m_length, hasTerminatingNullCharacter() ? DoesHaveTerminatingNullCharacter : DoesNotHaveTerminatingNullCharacter);
    1366         return StringImpl::createWithoutCopying(m_data16, m_length, hasTerminatingNullCharacter() ? DoesHaveTerminatingNullCharacter : DoesNotHaveTerminatingNullCharacter);
     1353            return StringImpl::createWithoutCopying(m_data8, m_length);
     1354        return StringImpl::createWithoutCopying(m_data16, m_length);
    13671355    }
    13681356
  • trunk/Source/WTF/wtf/text/WTFString.cpp

    r152142 r152201  
    417417}
    418418
    419 const UChar* String::deprecatedCharactersWithNullTermination()
    420 {
    421     if (!m_impl)
    422         return 0;
    423     if (m_impl->hasTerminatingNullCharacter())
    424         return m_impl->characters();
    425     m_impl = StringImpl::createWithTerminatingNullCharacter(*m_impl);
    426     return m_impl->characters();
    427 }
    428 
    429419String String::format(const char *format, ...)
    430420{
  • trunk/Source/WTF/wtf/text/WTFString.h

    r152142 r152201  
    283283
    284284    WTF_EXPORT_STRING_API Vector<UChar> charactersWithNullTermination() const;
    285     WTF_EXPORT_STRING_API const UChar* deprecatedCharactersWithNullTermination();
    286285   
    287286    WTF_EXPORT_STRING_API UChar32 characterStartingAt(unsigned) const; // Ditto.
  • trunk/Tools/ChangeLog

    r152196 r152201  
     12013-06-28  Anders Carlsson  <andersca@apple.com>
     2
     3        Remove String::deprecatedCharactersWithNullTermination() and related code
     4        https://bugs.webkit.org/show_bug.cgi?id=118211
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        Remove all hasTerminatingNullCharacter() checks.
     9
     10        * TestWebKitAPI/Tests/WTF/AtomicString.cpp:
     11        (TestWebKitAPI::TEST):
     12        * TestWebKitAPI/Tests/WTF/StringImpl.cpp:
     13        (TestWebKitAPI::TEST):
     14        * TestWebKitAPI/Tests/WTF/WTFString.cpp:
     15        (TestWebKitAPI::TEST):
     16
    1172013-06-28  Alexey Proskuryakov  <ap@apple.com>
    218
  • trunk/Tools/TestWebKitAPI/Tests/WTF/AtomicString.cpp

    r124611 r152201  
    3636    ASSERT_TRUE(stringWithTemplate == "Template Literal");
    3737    ASSERT_TRUE(stringWithTemplate.string().is8Bit());
    38     ASSERT_TRUE(stringWithTemplate.impl()->hasTerminatingNullCharacter());
    3938
    4039    const char* programmaticStringData = "Explicit Size Literal";
     
    4342    ASSERT_TRUE(programmaticStringData == programmaticStringData);
    4443    ASSERT_TRUE(programmaticString.string().is8Bit());
    45     ASSERT_TRUE(programmaticString.impl()->hasTerminatingNullCharacter());
    4644    ASSERT_EQ(programmaticStringData, reinterpret_cast<const char*>(programmaticString.string().characters8()));
    4745}
  • trunk/Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp

    r133731 r152201  
    3838    ASSERT_TRUE(equal(stringWithTemplate.get(), "Template Literal"));
    3939    ASSERT_TRUE(stringWithTemplate->is8Bit());
    40     ASSERT_TRUE(stringWithTemplate->hasTerminatingNullCharacter());
    4140
    4241    // Constructor taking the size explicitely.
     
    4746    ASSERT_EQ(programmaticStringData, reinterpret_cast<const char*>(programmaticString->characters8()));
    4847    ASSERT_TRUE(programmaticString->is8Bit());
    49     ASSERT_TRUE(programmaticString->hasTerminatingNullCharacter());
    5048
    5149    // Constructor without explicit size.
     
    5654    ASSERT_EQ(stringWithoutLengthLiteral, reinterpret_cast<const char*>(programmaticStringNoLength->characters8()));
    5755    ASSERT_TRUE(programmaticStringNoLength->is8Bit());
    58     ASSERT_TRUE(programmaticStringNoLength->hasTerminatingNullCharacter());
    5956}
    6057
  • trunk/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp

    r133731 r152201  
    3939    ASSERT_TRUE(stringFromLiteral == "Explicit construction syntax");
    4040    ASSERT_TRUE(stringFromLiteral.is8Bit());
    41     ASSERT_TRUE(stringFromLiteral.impl()->hasTerminatingNullCharacter());
    4241    ASSERT_TRUE(String("Explicit construction syntax") == stringFromLiteral);
    4342
     
    4645    ASSERT_TRUE(stringWithTemplate == "Template Literal");
    4746    ASSERT_TRUE(stringWithTemplate.is8Bit());
    48     ASSERT_TRUE(stringWithTemplate.impl()->hasTerminatingNullCharacter());
    4947    ASSERT_TRUE(String("Template Literal") == stringWithTemplate);
    5048}
Note: See TracChangeset for help on using the changeset viewer.