Changeset 152356 in webkit
- Timestamp:
- Jul 3, 2013 8:38:49 AM (11 years ago)
- Location:
- trunk/Source/WTF
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r152349 r152356 1 2013-07-03 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> 2 3 Remove code duplication from StringImpl create()/reallocate() methods 4 https://bugs.webkit.org/show_bug.cgi?id=118355 5 6 Reviewed by Anders Carlsson. 7 8 StringImpl create()/reallocate() methods accepting LChar and UChar used to have 9 duplicated code. The code duplication is removed now via used templates. 10 11 * wtf/text/StringImpl.cpp: 12 (WTF::StringImpl::constructInternal): 13 (WTF::LChar): 14 (WTF::StringImpl::createUninitializedInternal): 15 (WTF::StringImpl::createUninitialized): 16 (WTF::StringImpl::reallocateInternal): 17 (WTF::StringImpl::reallocate): 18 (WTF::StringImpl::createInternal): 19 (WTF::StringImpl::create): 20 * wtf/text/StringImpl.h: 21 1 22 2013-07-03 Csaba Osztrogonác <ossy@webkit.org> 2 23 -
trunk/Source/WTF/wtf/text/StringImpl.cpp
r152201 r152356 183 183 } 184 184 185 PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, LChar*& data) 185 template <typename CharType> 186 inline PassRefPtr<StringImpl> StringImpl::constructInternal(StringImpl* stringImpl, unsigned length) 187 { 188 return adoptRef(new (NotNull, stringImpl) StringImpl(length)); 189 } 190 191 template <> 192 inline PassRefPtr<StringImpl> StringImpl::constructInternal<LChar>(StringImpl* stringImpl, unsigned length) 193 { 194 return adoptRef(new (NotNull, stringImpl) StringImpl(length, Force8BitConstructor)); 195 } 196 197 template <typename CharType> 198 inline PassRefPtr<StringImpl> StringImpl::createUninitializedInternal(unsigned length, CharType*& data) 186 199 { 187 200 if (!length) { … … 193 206 // struct as well as the data which it contains. This removes one 194 207 // heap allocation from this call. 195 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof( LChar)))208 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof(CharType))) 196 209 CRASH(); 197 size_t size = sizeof(StringImpl) + length * sizeof( LChar);210 size_t size = sizeof(StringImpl) + length * sizeof(CharType); 198 211 StringImpl* string = static_cast<StringImpl*>(fastMalloc(size)); 199 212 200 data = reinterpret_cast<LChar*>(string + 1); 201 return adoptRef(new (NotNull, string) StringImpl(length, Force8BitConstructor)); 213 data = reinterpret_cast<CharType*>(string + 1); 214 return constructInternal<CharType>(string, length); 215 } 216 217 PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, LChar*& data) 218 { 219 return createUninitializedInternal(length, data); 202 220 } 203 221 204 222 PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, UChar*& data) 205 223 { 224 return createUninitializedInternal(length, data); 225 } 226 227 template <typename CharType> 228 inline PassRefPtr<StringImpl> StringImpl::reallocateInternal(PassRefPtr<StringImpl> originalString, unsigned length, CharType*& data) 229 { 230 ASSERT(originalString->is8Bit()); 231 ASSERT(originalString->hasOneRef()); 232 ASSERT(originalString->bufferOwnership() == BufferInternal); 233 206 234 if (!length) { 207 235 data = 0; … … 209 237 } 210 238 211 // Allocate a single buffer large enough to contain the StringImpl 212 // struct as well as the data which it contains. This removes one 213 // heap allocation from this call. 214 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof(UChar))) 239 // Same as createUninitialized() except here we use fastRealloc. 240 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof(CharType))) 215 241 CRASH(); 216 size_t size = sizeof(StringImpl) + length * sizeof(UChar); 217 StringImpl* string = static_cast<StringImpl*>(fastMalloc(size)); 218 219 data = reinterpret_cast<UChar*>(string + 1); 220 return adoptRef(new (NotNull, string) StringImpl(length)); 221 } 222 223 PassRefPtr<StringImpl> StringImpl::reallocate(PassRefPtr<StringImpl> originalString, unsigned length, LChar*& data) 224 { 225 ASSERT(originalString->is8Bit()); 226 ASSERT(originalString->hasOneRef()); 227 ASSERT(originalString->bufferOwnership() == BufferInternal); 228 229 if (!length) { 230 data = 0; 231 return empty(); 232 } 233 234 // Same as createUninitialized() except here we use fastRealloc. 235 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof(LChar))) 236 CRASH(); 237 size_t size = sizeof(StringImpl) + length * sizeof(LChar); 242 size_t size = sizeof(StringImpl) + length * sizeof(CharType); 238 243 originalString->~StringImpl(); 239 244 StringImpl* string = static_cast<StringImpl*>(fastRealloc(originalString.leakRef(), size)); 240 245 241 data = reinterpret_cast<LChar*>(string + 1); 242 return adoptRef(new (NotNull, string) StringImpl(length, Force8BitConstructor)); 246 data = reinterpret_cast<CharType*>(string + 1); 247 return constructInternal<CharType>(string, length); 248 } 249 250 PassRefPtr<StringImpl> StringImpl::reallocate(PassRefPtr<StringImpl> originalString, unsigned length, LChar*& data) 251 { 252 return reallocateInternal(originalString, length, data); 243 253 } 244 254 245 255 PassRefPtr<StringImpl> StringImpl::reallocate(PassRefPtr<StringImpl> originalString, unsigned length, UChar*& data) 246 256 { 247 ASSERT(!originalString->is8Bit()); 248 ASSERT(originalString->hasOneRef()); 249 ASSERT(originalString->bufferOwnership() == BufferInternal); 250 251 if (!length) { 252 data = 0; 253 return empty(); 254 } 255 256 // Same as createUninitialized() except here we use fastRealloc. 257 if (length > ((std::numeric_limits<unsigned>::max() - sizeof(StringImpl)) / sizeof(UChar))) 258 CRASH(); 259 size_t size = sizeof(StringImpl) + length * sizeof(UChar); 260 originalString->~StringImpl(); 261 StringImpl* string = static_cast<StringImpl*>(fastRealloc(originalString.leakRef(), size)); 262 263 data = reinterpret_cast<UChar*>(string + 1); 264 return adoptRef(new (NotNull, string) StringImpl(length)); 265 } 266 267 PassRefPtr<StringImpl> StringImpl::create(const UChar* characters, unsigned length) 257 return reallocateInternal(originalString, length, data); 258 } 259 260 template <typename CharType> 261 inline PassRefPtr<StringImpl> StringImpl::createInternal(const CharType* characters, unsigned length) 268 262 { 269 263 if (!characters || !length) 270 264 return empty(); 271 265 272 UChar* data;266 CharType* data; 273 267 RefPtr<StringImpl> string = createUninitialized(length, data); 274 memcpy(data, characters, length * sizeof( UChar));268 memcpy(data, characters, length * sizeof(CharType)); 275 269 return string.release(); 276 270 } 277 271 272 PassRefPtr<StringImpl> StringImpl::create(const UChar* characters, unsigned length) 273 { 274 return createInternal(characters, length); 275 } 276 278 277 PassRefPtr<StringImpl> StringImpl::create(const LChar* characters, unsigned length) 279 278 { 280 if (!characters || !length) 281 return empty(); 282 283 LChar* data; 284 RefPtr<StringImpl> string = createUninitialized(length, data); 285 memcpy(data, characters, length * sizeof(LChar)); 286 return string.release(); 279 return createInternal(characters, length); 287 280 } 288 281 -
trunk/Source/WTF/wtf/text/StringImpl.h
r152201 r152356 771 771 template <class UCharPredicate> PassRefPtr<StringImpl> stripMatchedCharacters(UCharPredicate); 772 772 template <typename CharType, class UCharPredicate> PassRefPtr<StringImpl> simplifyMatchedCharactersToSpace(UCharPredicate); 773 template <typename CharType> static PassRefPtr<StringImpl> constructInternal(StringImpl*, unsigned); 774 template <typename CharType> static PassRefPtr<StringImpl> createUninitializedInternal(unsigned, CharType*&); 775 template <typename CharType> static PassRefPtr<StringImpl> reallocateInternal(PassRefPtr<StringImpl>, unsigned, CharType*&); 776 template <typename CharType> static PassRefPtr<StringImpl> createInternal(const CharType*, unsigned); 773 777 WTF_EXPORT_STRING_API NEVER_INLINE const UChar* getData16SlowCase() const; 774 778 WTF_EXPORT_PRIVATE NEVER_INLINE unsigned hashSlowCase() const;
Note: See TracChangeset
for help on using the changeset viewer.