Modified: trunk/Source/WTF/wtf/text/AtomicStringImpl.cpp (219520 => 219521)
--- trunk/Source/WTF/wtf/text/AtomicStringImpl.cpp 2017-07-14 20:17:18 UTC (rev 219520)
+++ trunk/Source/WTF/wtf/text/AtomicStringImpl.cpp 2017-07-14 20:27:05 UTC (rev 219521)
@@ -95,70 +95,55 @@
}
struct CStringTranslator {
- static unsigned hash(const LChar* characters)
+ static unsigned hash(const LChar* c)
{
- return StringHasher::computeHashAndMaskTop8Bits(characters);
+ return StringHasher::computeHashAndMaskTop8Bits(c);
}
- static inline bool equal(StringImpl* str, const LChar* characters)
+ static inline bool equal(StringImpl* r, const LChar* s)
{
- return WTF::equal(str, characters);
+ return WTF::equal(r, s);
}
- static void translate(StringImpl*& location, const LChar* const& characters, unsigned hash)
+ static void translate(StringImpl*& location, const LChar* const& c, unsigned hash)
{
- location = &StringImpl::create(characters).leakRef();
+ location = &StringImpl::create(c).leakRef();
location->setHash(hash);
location->setIsAtomic(true);
}
};
-RefPtr<AtomicStringImpl> AtomicStringImpl::add(const LChar* characters)
+RefPtr<AtomicStringImpl> AtomicStringImpl::add(const LChar* c)
{
- if (!characters)
+ if (!c)
return nullptr;
- if (!*characters)
+ if (!*c)
return static_cast<AtomicStringImpl*>(StringImpl::empty());
- return addToStringTable<const LChar*, CStringTranslator>(characters);
+ return addToStringTable<const LChar*, CStringTranslator>(c);
}
template<typename CharacterType>
struct HashTranslatorCharBuffer {
- const CharacterType* characters;
+ const CharacterType* s;
unsigned length;
- unsigned hash;
-
- HashTranslatorCharBuffer(const CharacterType* characters, unsigned length)
- : characters(characters)
- , length(length)
- , hash(StringHasher::computeHashAndMaskTop8Bits(characters, length))
- {
- }
-
- HashTranslatorCharBuffer(const CharacterType* characters, unsigned length, unsigned hash)
- : characters(characters)
- , length(length)
- , hash(hash)
- {
- }
};
-using UCharBuffer = HashTranslatorCharBuffer<UChar>;
+typedef HashTranslatorCharBuffer<UChar> UCharBuffer;
struct UCharBufferTranslator {
static unsigned hash(const UCharBuffer& buf)
{
- return buf.hash;
+ return StringHasher::computeHashAndMaskTop8Bits(buf.s, buf.length);
}
static bool equal(StringImpl* const& str, const UCharBuffer& buf)
{
- return WTF::equal(str, buf.characters, buf.length);
+ return WTF::equal(str, buf.s, buf.length);
}
static void translate(StringImpl*& location, const UCharBuffer& buf, unsigned hash)
{
- location = &StringImpl::create8BitIfPossible(buf.characters, buf.length).leakRef();
+ location = &StringImpl::create8BitIfPossible(buf.s, buf.length).leakRef();
location->setHash(hash);
location->setIsAtomic(true);
}
@@ -232,31 +217,31 @@
}
};
-RefPtr<AtomicStringImpl> AtomicStringImpl::add(const UChar* characters, unsigned length)
+RefPtr<AtomicStringImpl> AtomicStringImpl::add(const UChar* s, unsigned length)
{
- if (!characters)
+ if (!s)
return nullptr;
if (!length)
return static_cast<AtomicStringImpl*>(StringImpl::empty());
- UCharBuffer buffer { characters, length };
+ UCharBuffer buffer = { s, length };
return addToStringTable<UCharBuffer, UCharBufferTranslator>(buffer);
}
-RefPtr<AtomicStringImpl> AtomicStringImpl::add(const UChar* characters)
+RefPtr<AtomicStringImpl> AtomicStringImpl::add(const UChar* s)
{
- if (!characters)
+ if (!s)
return nullptr;
unsigned length = 0;
- while (characters[length] != UChar(0))
+ while (s[length] != UChar(0))
++length;
if (!length)
return static_cast<AtomicStringImpl*>(StringImpl::empty());
- UCharBuffer buffer { characters, length };
+ UCharBuffer buffer = { s, length };
return addToStringTable<UCharBuffer, UCharBufferTranslator>(buffer);
}
@@ -320,56 +305,55 @@
return addToStringTable<SubstringLocation, SubstringTranslator16>(buffer);
}
-using LCharBuffer = HashTranslatorCharBuffer<LChar>;
+typedef HashTranslatorCharBuffer<LChar> LCharBuffer;
struct LCharBufferTranslator {
static unsigned hash(const LCharBuffer& buf)
{
- return buf.hash;
+ return StringHasher::computeHashAndMaskTop8Bits(buf.s, buf.length);
}
static bool equal(StringImpl* const& str, const LCharBuffer& buf)
{
- return WTF::equal(str, buf.characters, buf.length);
+ return WTF::equal(str, buf.s, buf.length);
}
static void translate(StringImpl*& location, const LCharBuffer& buf, unsigned hash)
{
- location = &StringImpl::create(buf.characters, buf.length).leakRef();
+ location = &StringImpl::create(buf.s, buf.length).leakRef();
location->setHash(hash);
location->setIsAtomic(true);
}
};
-template<typename CharType>
-struct BufferFromStaticDataTranslator {
- using Buffer = HashTranslatorCharBuffer<CharType>;
- static unsigned hash(const Buffer& buf)
+typedef HashTranslatorCharBuffer<char> CharBuffer;
+struct CharBufferFromLiteralDataTranslator {
+ static unsigned hash(const CharBuffer& buf)
{
- return buf.hash;
+ return StringHasher::computeHashAndMaskTop8Bits(reinterpret_cast<const LChar*>(buf.s), buf.length);
}
- static bool equal(StringImpl* const& str, const Buffer& buf)
+ static bool equal(StringImpl* const& str, const CharBuffer& buf)
{
- return WTF::equal(str, buf.characters, buf.length);
+ return WTF::equal(str, buf.s, buf.length);
}
- static void translate(StringImpl*& location, const Buffer& buf, unsigned hash)
+ static void translate(StringImpl*& location, const CharBuffer& buf, unsigned hash)
{
- location = &StringImpl::createWithoutCopying(buf.characters, buf.length).leakRef();
+ location = &StringImpl::createFromLiteral(buf.s, buf.length).leakRef();
location->setHash(hash);
location->setIsAtomic(true);
}
};
-RefPtr<AtomicStringImpl> AtomicStringImpl::add(const LChar* characters, unsigned length)
+RefPtr<AtomicStringImpl> AtomicStringImpl::add(const LChar* s, unsigned length)
{
- if (!characters)
+ if (!s)
return nullptr;
if (!length)
return static_cast<AtomicStringImpl*>(StringImpl::empty());
- LCharBuffer buffer { characters, length };
+ LCharBuffer buffer = { s, length };
return addToStringTable<LCharBuffer, LCharBufferTranslator>(buffer);
}
@@ -378,14 +362,14 @@
ASSERT(characters);
ASSERT(length);
- LCharBuffer buffer { reinterpret_cast<const LChar*>(characters), length };
- return addToStringTable<LCharBuffer, BufferFromStaticDataTranslator<LChar>>(buffer);
+ CharBuffer buffer = { characters, length };
+ return addToStringTable<CharBuffer, CharBufferFromLiteralDataTranslator>(buffer);
}
-static Ref<AtomicStringImpl> addSymbol(AtomicStringTableLocker& locker, StringTableImpl& atomicStringTable, StringImpl& base)
+static inline Ref<AtomicStringImpl> addSubstring(AtomicStringTableLocker& locker, StringTableImpl& atomicStringTable, StringImpl& base)
{
ASSERT(base.length());
- ASSERT(base.isSymbol());
+ ASSERT(base.isSymbol() || base.isStatic());
SubstringLocation buffer = { &base, 0, base.length() };
if (base.is8Bit())
@@ -393,41 +377,20 @@
return addToStringTable<SubstringLocation, SubstringTranslator16>(locker, atomicStringTable, buffer);
}
-static inline Ref<AtomicStringImpl> addSymbol(StringImpl& base)
+static inline Ref<AtomicStringImpl> addSubstring(StringImpl& base)
{
AtomicStringTableLocker locker;
- return addSymbol(locker, stringTable(), base);
+ return addSubstring(locker, stringTable(), base);
}
-static Ref<AtomicStringImpl> addStatic(AtomicStringTableLocker& locker, StringTableImpl& atomicStringTable, StringImpl& base)
-{
- ASSERT(base.length());
- ASSERT(base.isStatic());
-
- if (base.is8Bit()) {
- LCharBuffer buffer { base.characters8(), base.length(), base.hash() };
- return addToStringTable<LCharBuffer, BufferFromStaticDataTranslator<LChar>>(locker, atomicStringTable, buffer);
- }
- UCharBuffer buffer { base.characters16(), base.length(), base.hash() };
- return addToStringTable<UCharBuffer, BufferFromStaticDataTranslator<UChar>>(locker, atomicStringTable, buffer);
-}
-
-static inline Ref<AtomicStringImpl> addStatic(StringImpl& base)
-{
- AtomicStringTableLocker locker;
- return addStatic(locker, stringTable(), base);
-}
-
Ref<AtomicStringImpl> AtomicStringImpl::addSlowCase(StringImpl& string)
{
- ASSERT_WITH_MESSAGE(string.length(), "Empty string should be already handled.");
+ if (!string.length())
+ return *static_cast<AtomicStringImpl*>(StringImpl::empty());
- if (string.isStatic())
- return addStatic(string);
+ if (string.isSymbol() || string.isStatic())
+ return addSubstring(string);
- if (string.isSymbol())
- return addSymbol(string);
-
ASSERT_WITH_MESSAGE(!string.isAtomic(), "AtomicStringImpl should not hit the slow case if the string is already atomic.");
AtomicStringTableLocker locker;
@@ -443,18 +406,14 @@
Ref<AtomicStringImpl> AtomicStringImpl::addSlowCase(AtomicStringTable& stringTable, StringImpl& string)
{
- ASSERT_WITH_MESSAGE(string.length(), "Empty string should be already handled.");
+ if (!string.length())
+ return *static_cast<AtomicStringImpl*>(StringImpl::empty());
- if (string.isStatic()) {
+ if (string.isSymbol() || string.isStatic()) {
AtomicStringTableLocker locker;
- return addStatic(locker, stringTable.table(), string);
+ return addSubstring(locker, stringTable.table(), string);
}
- if (string.isSymbol()) {
- AtomicStringTableLocker locker;
- return addSymbol(locker, stringTable.table(), string);
- }
-
ASSERT_WITH_MESSAGE(!string.isAtomic(), "AtomicStringImpl should not hit the slow case if the string is already atomic.");
AtomicStringTableLocker locker;
@@ -523,7 +482,7 @@
AtomicStringTableLocker locker;
auto& table = stringTable();
- UCharBuffer buffer { characters, length };
+ UCharBuffer buffer = { characters, length };
auto iterator = table.find<UCharBufferTranslator>(buffer);
if (iterator != table.end())
return static_cast<AtomicStringImpl*>(*iterator);