Changeset 152201 in webkit
- Timestamp:
- Jun 28, 2013 6:39:28 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/API/JSStringRef.cpp
r152052 r152201 64 64 { 65 65 initializeThreading(); 66 return OpaqueJSString::create(StringImpl::createWithoutCopying(chars, numChars , WTF::DoesNotHaveTerminatingNullCharacter)).leakRef();66 return OpaqueJSString::create(StringImpl::createWithoutCopying(chars, numChars)).leakRef(); 67 67 } 68 68 -
trunk/Source/JavaScriptCore/ChangeLog
r152091 r152201 1 2013-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 1 12 2013-06-27 Timothy Hatcher <timothy@apple.com> 2 13 -
trunk/Source/WTF/ChangeLog
r152142 r152201 1 2013-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 1 24 2013-06-27 Anders Carlsson <andersca@apple.com> 2 25 -
trunk/Source/WTF/wtf/text/StringImpl.cpp
r152052 r152201 159 159 ASSERT_WITH_MESSAGE(length, "Use StringImpl::empty() to create an empty string"); 160 160 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)); 162 162 } 163 163 … … 167 167 } 168 168 169 PassRefPtr<StringImpl> StringImpl::createWithoutCopying(const UChar* characters, unsigned length , HasTerminatingNullCharacter hasTerminatingNullCharacter)169 PassRefPtr<StringImpl> StringImpl::createWithoutCopying(const UChar* characters, unsigned length) 170 170 { 171 171 if (!length) 172 172 return empty(); 173 173 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 177 PassRefPtr<StringImpl> StringImpl::createWithoutCopying(const LChar* characters, unsigned length) 178 178 { 179 179 if (!length) 180 180 return empty(); 181 181 182 return adoptRef(new StringImpl(characters, length, hasTerminatingNullCharacter,ConstructWithoutCopying));182 return adoptRef(new StringImpl(characters, length, ConstructWithoutCopying)); 183 183 } 184 184 … … 334 334 335 335 unsigned len = length(); 336 if (hasTerminatingNullCharacter())337 ++len;338 336 339 337 m_copyData16 = static_cast<UChar*>(fastMalloc(len * sizeof(UChar))); … … 1956 1954 #endif 1957 1955 1958 PassRefPtr<StringImpl> StringImpl::createWithTerminatingNullCharacter(const StringImpl& string)1959 {1960 // Use createUninitialized instead of 'new StringImpl' so that the string and its buffer1961 // 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 1982 1956 size_t StringImpl::sizeInBytes() const 1983 1957 { … … 1987 1961 if (has16BitShadow()) { 1988 1962 size += 2 * size; 1989 if (hasTerminatingNullCharacter())1990 size += 2;1991 1963 } 1992 1964 } else -
trunk/Source/WTF/wtf/text/StringImpl.h
r152052 r152201 73 73 TextCaseInsensitive 74 74 }; 75 76 enum HasTerminatingNullCharacter {77 DoesNotHaveTerminatingNullCharacter,78 DoesHaveTerminatingNullCharacter,79 };80 81 75 82 76 typedef bool (*CharacterMatchFunctionPtr)(UChar); … … 250 244 251 245 enum ConstructWithoutCopyingTag { ConstructWithoutCopying }; 252 StringImpl(const UChar* characters, unsigned length, HasTerminatingNullCharacter hasTerminatingNullCharacter,ConstructWithoutCopyingTag)246 StringImpl(const UChar* characters, unsigned length, ConstructWithoutCopyingTag) 253 247 : m_refCount(s_refCountIncrement) 254 248 , m_length(length) 255 249 , m_data16(characters) 256 250 , m_buffer(0) 257 , m_hashAndFlags(BufferInternal | (hasTerminatingNullCharacter ? s_hashFlagHasTerminatingNullCharacter : 0))251 , m_hashAndFlags(BufferInternal) 258 252 { 259 253 ASSERT(m_data16); 260 254 ASSERT(m_length); 261 ASSERT(!(m_hashAndFlags & s_hashFlagHasTerminatingNullCharacter) || !characters[length]);262 255 263 256 STRING_STATS_ADD_16BIT_STRING(0); 264 257 } 265 258 266 StringImpl(const LChar* characters, unsigned length, HasTerminatingNullCharacter hasTerminatingNullCharacter,ConstructWithoutCopyingTag)259 StringImpl(const LChar* characters, unsigned length, ConstructWithoutCopyingTag) 267 260 : m_refCount(s_refCountIncrement) 268 261 , m_length(length) 269 262 , m_data8(characters) 270 263 , m_buffer(0) 271 , m_hashAndFlags(s_hashFlag8BitBuffer | BufferInternal | (hasTerminatingNullCharacter ? s_hashFlagHasTerminatingNullCharacter : 0))264 , m_hashAndFlags(s_hashFlag8BitBuffer | BufferInternal) 272 265 { 273 266 ASSERT(m_data8); 274 267 ASSERT(m_length); 275 ASSERT(!(m_hashAndFlags & s_hashFlagHasTerminatingNullCharacter) || !characters[length]);276 268 277 269 STRING_STATS_ADD_8BIT_STRING(0); … … 422 414 COMPILE_ASSERT((charactersCount - 1 <= ((unsigned(~0) - sizeof(StringImpl)) / sizeof(LChar))), StringImplFromLiteralCannotOverflow); 423 415 424 return createWithoutCopying(reinterpret_cast<const LChar*>(characters), charactersCount - 1 , DoesHaveTerminatingNullCharacter);416 return createWithoutCopying(reinterpret_cast<const LChar*>(characters), charactersCount - 1); 425 417 } 426 418 … … 429 421 WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createFromLiteral(const char* characters); 430 422 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); 433 425 434 426 WTF_EXPORT_STRING_API static PassRefPtr<StringImpl> createUninitialized(unsigned length, LChar*& data); … … 472 464 static unsigned flagIs8Bit() { return s_hashFlag8BitBuffer; } 473 465 static unsigned dataOffset() { return OBJECT_OFFSETOF(StringImpl, m_data8); } 474 static PassRefPtr<StringImpl> createWithTerminatingNullCharacter(const StringImpl&);475 466 476 467 template<typename CharType, size_t inlineCapacity, typename OverflowHandler> … … 541 532 return !length() && !isStatic(); 542 533 } 543 544 bool hasTerminatingNullCharacter() const { return m_hashAndFlags & s_hashFlagHasTerminatingNullCharacter; }545 534 546 535 bool isAtomic() const { return m_hashAndFlags & s_hashFlagIsAtomic; } … … 789 778 static const unsigned s_refCountIncrement = 0x2; // This allows us to ref / deref without disturbing the static string flag. 790 779 791 // The bottom 8bits 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; 793 782 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; 799 787 static const unsigned s_hashFlagIsAtomic = 1u << 4; 800 788 static const unsigned s_hashFlagDidReportCost = 1u << 3; … … 817 805 // These values mimic ConstructFromLiteral. 818 806 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; 820 808 static const unsigned s_hashShift = s_flagCount; 821 809 }; … … 1363 1351 if (!requiresCopy()) { 1364 1352 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); 1367 1355 } 1368 1356 -
trunk/Source/WTF/wtf/text/WTFString.cpp
r152142 r152201 417 417 } 418 418 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 429 419 String String::format(const char *format, ...) 430 420 { -
trunk/Source/WTF/wtf/text/WTFString.h
r152142 r152201 283 283 284 284 WTF_EXPORT_STRING_API Vector<UChar> charactersWithNullTermination() const; 285 WTF_EXPORT_STRING_API const UChar* deprecatedCharactersWithNullTermination();286 285 287 286 WTF_EXPORT_STRING_API UChar32 characterStartingAt(unsigned) const; // Ditto. -
trunk/Tools/ChangeLog
r152196 r152201 1 2013-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 1 17 2013-06-28 Alexey Proskuryakov <ap@apple.com> 2 18 -
trunk/Tools/TestWebKitAPI/Tests/WTF/AtomicString.cpp
r124611 r152201 36 36 ASSERT_TRUE(stringWithTemplate == "Template Literal"); 37 37 ASSERT_TRUE(stringWithTemplate.string().is8Bit()); 38 ASSERT_TRUE(stringWithTemplate.impl()->hasTerminatingNullCharacter());39 38 40 39 const char* programmaticStringData = "Explicit Size Literal"; … … 43 42 ASSERT_TRUE(programmaticStringData == programmaticStringData); 44 43 ASSERT_TRUE(programmaticString.string().is8Bit()); 45 ASSERT_TRUE(programmaticString.impl()->hasTerminatingNullCharacter());46 44 ASSERT_EQ(programmaticStringData, reinterpret_cast<const char*>(programmaticString.string().characters8())); 47 45 } -
trunk/Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp
r133731 r152201 38 38 ASSERT_TRUE(equal(stringWithTemplate.get(), "Template Literal")); 39 39 ASSERT_TRUE(stringWithTemplate->is8Bit()); 40 ASSERT_TRUE(stringWithTemplate->hasTerminatingNullCharacter());41 40 42 41 // Constructor taking the size explicitely. … … 47 46 ASSERT_EQ(programmaticStringData, reinterpret_cast<const char*>(programmaticString->characters8())); 48 47 ASSERT_TRUE(programmaticString->is8Bit()); 49 ASSERT_TRUE(programmaticString->hasTerminatingNullCharacter());50 48 51 49 // Constructor without explicit size. … … 56 54 ASSERT_EQ(stringWithoutLengthLiteral, reinterpret_cast<const char*>(programmaticStringNoLength->characters8())); 57 55 ASSERT_TRUE(programmaticStringNoLength->is8Bit()); 58 ASSERT_TRUE(programmaticStringNoLength->hasTerminatingNullCharacter());59 56 } 60 57 -
trunk/Tools/TestWebKitAPI/Tests/WTF/WTFString.cpp
r133731 r152201 39 39 ASSERT_TRUE(stringFromLiteral == "Explicit construction syntax"); 40 40 ASSERT_TRUE(stringFromLiteral.is8Bit()); 41 ASSERT_TRUE(stringFromLiteral.impl()->hasTerminatingNullCharacter());42 41 ASSERT_TRUE(String("Explicit construction syntax") == stringFromLiteral); 43 42 … … 46 45 ASSERT_TRUE(stringWithTemplate == "Template Literal"); 47 46 ASSERT_TRUE(stringWithTemplate.is8Bit()); 48 ASSERT_TRUE(stringWithTemplate.impl()->hasTerminatingNullCharacter());49 47 ASSERT_TRUE(String("Template Literal") == stringWithTemplate); 50 48 }
Note: See TracChangeset
for help on using the changeset viewer.