Commit dcb58b3f authored by esprehn's avatar esprehn Committed by Commit bot

Simplify AtomicStringTable and remove lots of dead code.

The special path for doing substring additions only made sense when we
shared StringImpls for substrings, now that we don't there's no reason
to keep it. The code was dead either way with nothing calling it
anymore.

I also removed constructors for AtomicString that no one used and
switched to using lengthOfNullTerminatedString directly in AtomicString
instead of having a separate code path in AtomicStringTable for finding
the length of UChar* strings.

Finally I simplified AtomicStringTable::remove which was using a find
codepath designed to find a string that may not exist in the table
without actually allocating a new string. This doesn't make sense since
remove is only ever called from StringImpl's destructor on a string we
already know to be atomic so it must be in the table and must have a
hash so we can just do m_table.remove on it.

Review-Url: https://codereview.chromium.org/2111653004
Cr-Commit-Position: refs/heads/master@{#403408}
parent 464918cc
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "wtf/dtoa.h" #include "wtf/dtoa.h"
#include "wtf/text/AtomicStringTable.h" #include "wtf/text/AtomicStringTable.h"
#include "wtf/text/IntegerToStringConversion.h" #include "wtf/text/IntegerToStringConversion.h"
#include "wtf/text/StringImpl.h"
namespace WTF { namespace WTF {
...@@ -36,19 +37,13 @@ AtomicString::AtomicString(const LChar* chars, unsigned length) ...@@ -36,19 +37,13 @@ AtomicString::AtomicString(const LChar* chars, unsigned length)
AtomicString::AtomicString(const UChar* chars, unsigned length) AtomicString::AtomicString(const UChar* chars, unsigned length)
: m_string(AtomicStringTable::instance().add(chars, length)) {} : m_string(AtomicStringTable::instance().add(chars, length)) {}
AtomicString::AtomicString(const UChar* chars, unsigned length, unsigned existingHash)
: m_string(AtomicStringTable::instance().add(chars, length, existingHash)) {}
AtomicString::AtomicString(const UChar* chars) AtomicString::AtomicString(const UChar* chars)
: m_string(AtomicStringTable::instance().add(chars)) {} : m_string(AtomicStringTable::instance().add(chars, chars ? lengthOfNullTerminatedString(chars) : 0)) {}
AtomicString::AtomicString(StringImpl* string, unsigned offset, unsigned length)
: m_string(AtomicStringTable::instance().add(string, offset, length)) {}
PassRefPtr<StringImpl> AtomicString::addSlowCase(StringImpl* chars) PassRefPtr<StringImpl> AtomicString::addSlowCase(StringImpl* string)
{ {
DCHECK(!chars->isAtomic()); DCHECK(!string->isAtomic());
return AtomicStringTable::instance().add(chars); return AtomicStringTable::instance().add(string);
} }
AtomicString AtomicString::fromUTF8(const char* chars, size_t length) AtomicString AtomicString::fromUTF8(const char* chars, size_t length)
......
...@@ -45,7 +45,6 @@ public: ...@@ -45,7 +45,6 @@ public:
: AtomicString(reinterpret_cast<const LChar*>(chars)) {} : AtomicString(reinterpret_cast<const LChar*>(chars)) {}
AtomicString(const LChar* chars, unsigned length); AtomicString(const LChar* chars, unsigned length);
AtomicString(const UChar* chars, unsigned length); AtomicString(const UChar* chars, unsigned length);
AtomicString(const UChar* chars, unsigned length, unsigned existingHash);
AtomicString(const UChar* chars); AtomicString(const UChar* chars);
template<size_t inlineCapacity> template<size_t inlineCapacity>
...@@ -57,8 +56,6 @@ public: ...@@ -57,8 +56,6 @@ public:
explicit AtomicString(StringImpl* impl) : m_string(add(impl)) { } explicit AtomicString(StringImpl* impl) : m_string(add(impl)) { }
explicit AtomicString(const String& s) : m_string(add(s.impl())) { } explicit AtomicString(const String& s) : m_string(add(s.impl())) { }
AtomicString(StringImpl* baseString, unsigned start, unsigned length);
// Hash table deleted values, which are only constructed and never copied or destroyed. // Hash table deleted values, which are only constructed and never copied or destroyed.
AtomicString(WTF::HashTableDeletedValueType) : m_string(WTF::HashTableDeletedValue) { } AtomicString(WTF::HashTableDeletedValueType) : m_string(WTF::HashTableDeletedValue) { }
bool isHashTableDeletedValue() const { return m_string.isHashTableDeletedValue(); } bool isHashTableDeletedValue() const { return m_string.isHashTableDeletedValue(); }
......
...@@ -68,34 +68,6 @@ struct UCharBufferTranslator { ...@@ -68,34 +68,6 @@ struct UCharBufferTranslator {
} }
}; };
template<typename CharacterType>
struct HashAndCharacters {
unsigned hash;
const CharacterType* characters;
unsigned length;
};
template<typename CharacterType>
struct HashAndCharactersTranslator {
static unsigned hash(const HashAndCharacters<CharacterType>& buffer)
{
DCHECK(buffer.hash == StringHasher::computeHashAndMaskTop8Bits(buffer.characters, buffer.length));
return buffer.hash;
}
static bool equal(StringImpl* const& string, const HashAndCharacters<CharacterType>& buffer)
{
return WTF::equal(string, buffer.characters, buffer.length);
}
static void translate(StringImpl*& location, const HashAndCharacters<CharacterType>& buffer, unsigned hash)
{
location = StringImpl::create(buffer.characters, buffer.length).leakRef();
location->setHash(hash);
location->setIsAtomic(true);
}
};
struct HashAndUTF8Characters { struct HashAndUTF8Characters {
unsigned hash; unsigned hash;
const char* characters; const char* characters;
...@@ -178,82 +150,6 @@ PassRefPtr<StringImpl> AtomicStringTable::add(const UChar* s, unsigned length) ...@@ -178,82 +150,6 @@ PassRefPtr<StringImpl> AtomicStringTable::add(const UChar* s, unsigned length)
return addToStringTable<UCharBuffer, UCharBufferTranslator>(buffer); return addToStringTable<UCharBuffer, UCharBufferTranslator>(buffer);
} }
PassRefPtr<StringImpl> AtomicStringTable::add(const UChar* s, unsigned length, unsigned existingHash)
{
DCHECK(s);
DCHECK(existingHash);
if (!length)
return StringImpl::empty();
HashAndCharacters<UChar> buffer = { existingHash, s, length };
return addToStringTable<HashAndCharacters<UChar>, HashAndCharactersTranslator<UChar>>(buffer);
}
PassRefPtr<StringImpl> AtomicStringTable::add(const UChar* s)
{
if (!s)
return nullptr;
unsigned length = 0;
while (s[length] != UChar(0))
++length;
if (!length)
return StringImpl::empty();
UCharBuffer buffer = { s, length };
return addToStringTable<UCharBuffer, UCharBufferTranslator>(buffer);
}
struct SubstringLocation {
StringImpl* baseString;
unsigned start;
unsigned length;
};
struct SubstringTranslator {
static unsigned hash(const SubstringLocation& buffer)
{
if (buffer.baseString->is8Bit())
return StringHasher::computeHashAndMaskTop8Bits(buffer.baseString->characters8() + buffer.start, buffer.length);
return StringHasher::computeHashAndMaskTop8Bits(buffer.baseString->characters16() + buffer.start, buffer.length);
}
static bool equal(StringImpl* const& string, const SubstringLocation& buffer)
{
if (buffer.baseString->is8Bit())
return WTF::equal(string, buffer.baseString->characters8() + buffer.start, buffer.length);
return WTF::equal(string, buffer.baseString->characters16() + buffer.start, buffer.length);
}
static void translate(StringImpl*& location, const SubstringLocation& buffer, unsigned hash)
{
location = buffer.baseString->substring(buffer.start, buffer.length).leakRef();
location->setHash(hash);
location->setIsAtomic(true);
}
};
PassRefPtr<StringImpl> AtomicStringTable::add(StringImpl* baseString, unsigned start, unsigned length)
{
if (!baseString)
return nullptr;
if (!length || start >= baseString->length())
return StringImpl::empty();
unsigned maxLength = baseString->length() - start;
if (length >= maxLength) {
if (!start)
return add(baseString);
length = maxLength;
}
SubstringLocation buffer = { baseString, start, length };
return addToStringTable<SubstringLocation, SubstringTranslator>(buffer);
}
typedef HashTranslatorCharBuffer<LChar> LCharBuffer; typedef HashTranslatorCharBuffer<LChar> LCharBuffer;
struct LCharBufferTranslator { struct LCharBufferTranslator {
static unsigned hash(const LCharBuffer& buf) static unsigned hash(const LCharBuffer& buf)
...@@ -312,20 +208,10 @@ PassRefPtr<StringImpl> AtomicStringTable::addUTF8(const char* charactersStart, c ...@@ -312,20 +208,10 @@ PassRefPtr<StringImpl> AtomicStringTable::addUTF8(const char* charactersStart, c
return addToStringTable<HashAndUTF8Characters, HashAndUTF8CharactersTranslator>(buffer); return addToStringTable<HashAndUTF8Characters, HashAndUTF8CharactersTranslator>(buffer);
} }
template<typename CharacterType>
HashSet<StringImpl*>::iterator AtomicStringTable::find(const StringImpl* string)
{
HashAndCharacters<CharacterType> buffer = { string->existingHash(), string->getCharacters<CharacterType>(), string->length() };
return m_table.find<HashAndCharactersTranslator<CharacterType>>(buffer);
}
void AtomicStringTable::remove(StringImpl* string) void AtomicStringTable::remove(StringImpl* string)
{ {
HashSet<StringImpl*>::iterator iterator; DCHECK(string->isAtomic());
if (string->is8Bit()) auto iterator = m_table.find(string);
iterator = find<LChar>(string);
else
iterator = find<UChar>(string);
RELEASE_ASSERT(iterator != m_table.end()); RELEASE_ASSERT(iterator != m_table.end());
m_table.remove(iterator); m_table.remove(iterator);
} }
......
...@@ -31,19 +31,14 @@ public: ...@@ -31,19 +31,14 @@ public:
// Used by system initialization to preallocate enough storage for all of // Used by system initialization to preallocate enough storage for all of
// the static strings. // the static strings.
void reserveCapacity(unsigned); void reserveCapacity(unsigned size);
// Adding a StringImpl. // Inserting strings into the table. Note that the return value from adding
// a UChar string may be an LChar string as the table will attempt to
// convert the string to save memory if possible.
StringImpl* add(StringImpl*); StringImpl* add(StringImpl*);
PassRefPtr<StringImpl> add(StringImpl*, unsigned offset, unsigned length); PassRefPtr<StringImpl> add(const LChar* chars, unsigned length);
PassRefPtr<StringImpl> add(const UChar* chars, unsigned length);
// Adding an LChar.
PassRefPtr<StringImpl> add(const LChar*, unsigned length);
// Adding a UChar.
PassRefPtr<StringImpl> add(const UChar*, unsigned length);
PassRefPtr<StringImpl> add(const UChar*, unsigned length, unsigned existingHash);
PassRefPtr<StringImpl> add(const UChar*);
// Adding UTF8. // Adding UTF8.
// Returns null if the characters contain invalid utf8 sequences. // Returns null if the characters contain invalid utf8 sequences.
...@@ -58,9 +53,6 @@ private: ...@@ -58,9 +53,6 @@ private:
template<typename T, typename HashTranslator> template<typename T, typename HashTranslator>
inline PassRefPtr<StringImpl> addToStringTable(const T& value); inline PassRefPtr<StringImpl> addToStringTable(const T& value);
template<typename CharacterType>
inline HashSet<StringImpl*>::iterator find(const StringImpl*);
HashSet<StringImpl*> m_table; HashSet<StringImpl*> m_table;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment