| Index: third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
|
| diff --git a/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp b/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
|
| index 7da90e9cabd9f540cf1519e785f19c5f8f8344ce..cbcd0231c01218f93f834f9ca14902de0286b68c 100644
|
| --- a/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
|
| +++ b/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
|
| @@ -6,144 +6,62 @@
|
|
|
| #include "wtf/text/StringConcatenate.h"
|
|
|
| +#include "wtf/CheckedNumeric.h"
|
| +#include "wtf/text/StringImpl.h"
|
| +
|
| +namespace WTF {
|
| +
|
| // This macro is helpful for testing how many intermediate Strings are created while evaluating an
|
| // expression containing operator+.
|
| #ifndef WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING
|
| #define WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING() ((void)0)
|
| #endif
|
|
|
| -void WTF::StringTypeAdapter<char*>::writeTo(LChar* destination)
|
| -{
|
| - for (unsigned i = 0; i < m_length; ++i)
|
| - destination[i] = static_cast<LChar>(m_buffer[i]);
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<char*>::writeTo(UChar* destination)
|
| -{
|
| - for (unsigned i = 0; i < m_length; ++i) {
|
| - unsigned char c = m_buffer[i];
|
| - destination[i] = c;
|
| - }
|
| -}
|
| +namespace internal {
|
|
|
| -WTF::StringTypeAdapter<LChar*>::StringTypeAdapter(LChar* buffer)
|
| - : m_buffer(buffer)
|
| - , m_length(strlen(reinterpret_cast<char*>(buffer)))
|
| +unsigned checkedAddLength(unsigned a, unsigned b)
|
| {
|
| + CheckedNumeric<unsigned> length = a;
|
| + length += b;
|
| + return length.ValueOrDie();
|
| }
|
|
|
| -void WTF::StringTypeAdapter<LChar*>::writeTo(LChar* destination)
|
| -{
|
| - memcpy(destination, m_buffer, m_length * sizeof(LChar));
|
| -}
|
| +} // namespace internal
|
|
|
| -void WTF::StringTypeAdapter<LChar*>::writeTo(UChar* destination)
|
| +void StringTypeAdapter<const UChar*>::writeTo(UChar* destination) const
|
| {
|
| StringImpl::copyChars(destination, m_buffer, m_length);
|
| }
|
|
|
| -WTF::StringTypeAdapter<const UChar*>::StringTypeAdapter(const UChar* buffer)
|
| - : m_buffer(buffer)
|
| -{
|
| - size_t len = 0;
|
| - while (m_buffer[len] != UChar(0))
|
| - ++len;
|
| -
|
| - RELEASE_ASSERT(len <= std::numeric_limits<unsigned>::max());
|
| -
|
| - m_length = len;
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<const UChar*>::writeTo(UChar* destination)
|
| -{
|
| - memcpy(destination, m_buffer, m_length * sizeof(UChar));
|
| -}
|
| -
|
| -WTF::StringTypeAdapter<const char*>::StringTypeAdapter(const char* buffer)
|
| -: m_buffer(buffer)
|
| -, m_length(strlen(buffer))
|
| -{
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<const char*>::writeTo(LChar* destination)
|
| -{
|
| - memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar));
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<const char*>::writeTo(UChar* destination)
|
| -{
|
| - for (unsigned i = 0; i < m_length; ++i) {
|
| - unsigned char c = m_buffer[i];
|
| - destination[i] = c;
|
| - }
|
| -}
|
| -
|
| -WTF::StringTypeAdapter<const LChar*>::StringTypeAdapter(const LChar* buffer)
|
| -: m_buffer(buffer)
|
| -, m_length(strlen(reinterpret_cast<const char*>(buffer)))
|
| -{
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<const LChar*>::writeTo(LChar* destination)
|
| -{
|
| - memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar));
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<const LChar*>::writeTo(UChar* destination)
|
| +void StringTypeAdapter<const LChar*>::writeTo(LChar* destination) const
|
| {
|
| StringImpl::copyChars(destination, m_buffer, m_length);
|
| }
|
|
|
| -void WTF::StringTypeAdapter<Vector<char>>::writeTo(LChar* destination)
|
| +void StringTypeAdapter<const LChar*>::writeTo(UChar* destination) const
|
| {
|
| - for (size_t i = 0; i < m_buffer.size(); ++i)
|
| - destination[i] = static_cast<unsigned char>(m_buffer[i]);
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<Vector<char>>::writeTo(UChar* destination)
|
| -{
|
| - for (size_t i = 0; i < m_buffer.size(); ++i)
|
| - destination[i] = static_cast<unsigned char>(m_buffer[i]);
|
| -}
|
| -
|
| -void WTF::StringTypeAdapter<Vector<LChar>>::writeTo(LChar* destination)
|
| -{
|
| - for (size_t i = 0; i < m_buffer.size(); ++i)
|
| - destination[i] = m_buffer[i];
|
| + StringImpl::copyChars(destination, m_buffer, m_length);
|
| }
|
|
|
| -void WTF::StringTypeAdapter<Vector<LChar>>::writeTo(UChar* destination)
|
| -{
|
| - for (size_t i = 0; i < m_buffer.size(); ++i)
|
| - destination[i] = m_buffer[i];
|
| -}
|
| +StringTypeAdapter<const UChar*>::StringTypeAdapter(const UChar* buffer)
|
| + : m_buffer(buffer)
|
| + , m_length(lengthOfNullTerminatedString(buffer)) {}
|
|
|
| -void WTF::StringTypeAdapter<String>::writeTo(LChar* destination)
|
| +void StringTypeAdapter<String>::writeTo(LChar* destination) const
|
| {
|
| - unsigned length = m_buffer.length();
|
| -
|
| - ASSERT(is8Bit());
|
| - const LChar* data = m_buffer.characters8();
|
| - for (unsigned i = 0; i < length; ++i)
|
| - destination[i] = data[i];
|
| -
|
| + DCHECK(is8Bit());
|
| + StringImpl::copyChars(destination, m_buffer.characters8(), m_buffer.length());
|
| WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
|
| }
|
|
|
| -void WTF::StringTypeAdapter<String>::writeTo(UChar* destination)
|
| +void StringTypeAdapter<String>::writeTo(UChar* destination) const
|
| {
|
| - unsigned length = m_buffer.length();
|
| -
|
| - if (is8Bit()) {
|
| - const LChar* data = m_buffer.characters8();
|
| - for (unsigned i = 0; i < length; ++i)
|
| - destination[i] = data[i];
|
| - } else {
|
| - const UChar* data = m_buffer.characters16();
|
| - for (unsigned i = 0; i < length; ++i)
|
| - destination[i] = data[i];
|
| - }
|
| + if (is8Bit())
|
| + StringImpl::copyChars(destination, m_buffer.characters8(), m_buffer.length());
|
| + else
|
| + StringImpl::copyChars(destination, m_buffer.characters16(), m_buffer.length());
|
|
|
| WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
|
| }
|
|
|
| +} // namespace WTF
|
|
|