Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved. | 3 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved. |
| 4 * Copyright (C) 2009 Google Inc. All rights reserved. | 4 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 291 } | 291 } |
| 292 | 292 |
| 293 static StringImpl* empty(); | 293 static StringImpl* empty(); |
| 294 | 294 |
| 295 // FIXME: Does this really belong in StringImpl? | 295 // FIXME: Does this really belong in StringImpl? |
| 296 template <typename T> static void copyChars(T* destination, const T* source, unsigned numCharacters) | 296 template <typename T> static void copyChars(T* destination, const T* source, unsigned numCharacters) |
| 297 { | 297 { |
| 298 if (numCharacters == 1) { | 298 if (numCharacters == 1) { |
| 299 *destination = *source; | 299 *destination = *source; |
| 300 return; | 300 return; |
| 301 } | 301 } |
|
abarth-chromium
2014/03/24 16:46:54
Should we remove this branch too?
Mikhail
2014/03/25 10:30:26
This makes a bit better assembly, on the other han
| |
| 302 | 302 |
| 303 // FIXME: Is this implementation really faster than memcpy? | 303 memcpy(destination, source, numCharacters * sizeof(T)); |
| 304 if (numCharacters <= s_copyCharsInlineCutOff) { | |
| 305 unsigned i = 0; | |
| 306 #if (CPU(X86) || CPU(X86_64)) | |
| 307 const unsigned charsPerInt = sizeof(uint32_t) / sizeof(T); | |
| 308 | |
| 309 if (numCharacters > charsPerInt) { | |
| 310 unsigned stopCount = numCharacters & ~(charsPerInt - 1); | |
| 311 | |
| 312 const uint32_t* srcCharacters = reinterpret_cast<const uint32_t* >(source); | |
| 313 uint32_t* destCharacters = reinterpret_cast<uint32_t*>(destinati on); | |
| 314 for (unsigned j = 0; i < stopCount; i += charsPerInt, ++j) | |
| 315 destCharacters[j] = srcCharacters[j]; | |
| 316 } | |
| 317 #endif | |
| 318 for (; i < numCharacters; ++i) | |
| 319 destination[i] = source[i]; | |
| 320 } else | |
| 321 memcpy(destination, source, numCharacters * sizeof(T)); | |
| 322 } | 304 } |
| 323 | 305 |
| 324 ALWAYS_INLINE static void copyChars(UChar* destination, const LChar* source, unsigned numCharacters) | 306 ALWAYS_INLINE static void copyChars(UChar* destination, const LChar* source, unsigned numCharacters) |
| 325 { | 307 { |
| 326 for (unsigned i = 0; i < numCharacters; ++i) | 308 for (unsigned i = 0; i < numCharacters; ++i) |
| 327 destination[i] = source[i]; | 309 destination[i] = source[i]; |
| 328 } | 310 } |
| 329 | 311 |
| 330 // Some string features, like refcounting and the atomicity flag, are not | 312 // Some string features, like refcounting and the atomicity flag, are not |
| 331 // thread-safe. We achieve thread safety by isolation, giving each thread | 313 // thread-safe. We achieve thread safety by isolation, giving each thread |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 433 ALWAYS_INLINE static StringStats& stringStats() { return m_stringStats; } | 415 ALWAYS_INLINE static StringStats& stringStats() { return m_stringStats; } |
| 434 #endif | 416 #endif |
| 435 | 417 |
| 436 private: | 418 private: |
| 437 template<typename CharType> static size_t allocationSize(unsigned length) | 419 template<typename CharType> static size_t allocationSize(unsigned length) |
| 438 { | 420 { |
| 439 RELEASE_ASSERT(length <= ((std::numeric_limits<unsigned>::max() - sizeof (StringImpl)) / sizeof(CharType))); | 421 RELEASE_ASSERT(length <= ((std::numeric_limits<unsigned>::max() - sizeof (StringImpl)) / sizeof(CharType))); |
| 440 return sizeof(StringImpl) + length * sizeof(CharType); | 422 return sizeof(StringImpl) + length * sizeof(CharType); |
| 441 } | 423 } |
| 442 | 424 |
| 443 // This number must be at least 2 to avoid sharing empty, null as well as 1 character strings from SmallStrings. | |
|
abarth-chromium
2014/03/24 16:46:54
I take it this comment is no longer accurate? It
| |
| 444 static const unsigned s_copyCharsInlineCutOff = 20; | |
| 445 | |
| 446 template <class UCharPredicate> PassRefPtr<StringImpl> stripMatchedCharacter s(UCharPredicate); | 425 template <class UCharPredicate> PassRefPtr<StringImpl> stripMatchedCharacter s(UCharPredicate); |
| 447 template <typename CharType, class UCharPredicate> PassRefPtr<StringImpl> si mplifyMatchedCharactersToSpace(UCharPredicate, StripBehavior); | 426 template <typename CharType, class UCharPredicate> PassRefPtr<StringImpl> si mplifyMatchedCharactersToSpace(UCharPredicate, StripBehavior); |
| 448 NEVER_INLINE unsigned hashSlowCase() const; | 427 NEVER_INLINE unsigned hashSlowCase() const; |
| 449 | 428 |
| 450 #ifdef STRING_STATS | 429 #ifdef STRING_STATS |
| 451 static StringStats m_stringStats; | 430 static StringStats m_stringStats; |
| 452 #endif | 431 #endif |
| 453 | 432 |
| 454 static unsigned m_highestStaticStringLength; | 433 static unsigned m_highestStaticStringLength; |
| 455 | 434 |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 757 } | 736 } |
| 758 | 737 |
| 759 using WTF::StringImpl; | 738 using WTF::StringImpl; |
| 760 using WTF::equal; | 739 using WTF::equal; |
| 761 using WTF::equalNonNull; | 740 using WTF::equalNonNull; |
| 762 using WTF::TextCaseSensitivity; | 741 using WTF::TextCaseSensitivity; |
| 763 using WTF::TextCaseSensitive; | 742 using WTF::TextCaseSensitive; |
| 764 using WTF::TextCaseInsensitive; | 743 using WTF::TextCaseInsensitive; |
| 765 | 744 |
| 766 #endif | 745 #endif |
| OLD | NEW |