diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp b/chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp index 0e3d82d58e1..9236bf6fb55 100644 --- a/chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp +++ b/chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp @@ -29,6 +29,7 @@ #include "IntegerToStringConversion.h" #include "WTFString.h" +#include "wtf/dtoa.h" namespace WTF { @@ -166,9 +167,10 @@ void StringBuilder::reallocateBuffer<LChar>(unsigned requiredLength) ASSERT(m_is8Bit); ASSERT(m_buffer->is8Bit()); - if (m_buffer->hasOneRef()) - m_buffer = StringImpl::reallocate(m_buffer.release(), requiredLength, m_bufferCharacters8); - else + if (m_buffer->hasOneRef()) { + m_buffer = StringImpl::reallocate(m_buffer.release(), requiredLength); + m_bufferCharacters8 = const_cast<LChar*>(m_buffer->characters8()); + } else allocateBuffer(m_buffer->characters8(), requiredLength); } @@ -179,11 +181,12 @@ void StringBuilder::reallocateBuffer<UChar>(unsigned requiredLength) // otherwise fall back to "allocate and copy" method. m_string = String(); - if (m_buffer->is8Bit()) + if (m_buffer->is8Bit()) { allocateBufferUpConvert(m_buffer->characters8(), requiredLength); - else if (m_buffer->hasOneRef()) - m_buffer = StringImpl::reallocate(m_buffer.release(), requiredLength, m_bufferCharacters16); - else + } else if (m_buffer->hasOneRef()) { + m_buffer = StringImpl::reallocate(m_buffer.release(), requiredLength); + m_bufferCharacters16 = const_cast<UChar*>(m_buffer->characters16()); + } else allocateBuffer(m_buffer->characters16(), requiredLength); } @@ -319,7 +322,7 @@ void StringBuilder::appendNumber(int number) numberToStringSigned<StringBuilder>(number, this); } -void StringBuilder::appendNumber(unsigned int number) +void StringBuilder::appendNumber(unsigned number) { numberToStringUnsigned<StringBuilder>(number, this); } @@ -344,6 +347,35 @@ void StringBuilder::appendNumber(unsigned long long number) numberToStringUnsigned<StringBuilder>(number, this); } +static void expandLCharToUCharInplace(UChar* buffer, size_t length) +{ + const LChar* sourceEnd = reinterpret_cast<LChar*>(buffer) + length; + UChar* current = buffer + length; + while (current != buffer) + *--current = *--sourceEnd; +} + +void StringBuilder::appendNumber(double number, unsigned precision, TrailingZerosTruncatingPolicy trailingZerosTruncatingPolicy) +{ + bool truncateTrailingZeros = trailingZerosTruncatingPolicy == TruncateTrailingZeros; + size_t numberLength; + if (m_is8Bit) { + LChar* dest = appendUninitialized<LChar>(NumberToStringBufferLength); + const char* result = numberToFixedPrecisionString(number, precision, reinterpret_cast<char*>(dest), truncateTrailingZeros); + numberLength = strlen(result); + } else { + UChar* dest = appendUninitialized<UChar>(NumberToStringBufferLength); + const char* result = numberToFixedPrecisionString(number, precision, reinterpret_cast<char*>(dest), truncateTrailingZeros); + numberLength = strlen(result); + expandLCharToUCharInplace(dest, numberLength); + } + ASSERT(m_length >= NumberToStringBufferLength); + // Remove what appendUninitialized added. + m_length -= NumberToStringBufferLength; + ASSERT(numberLength <= NumberToStringBufferLength); + m_length += numberLength; +} + bool StringBuilder::canShrink() const { // Only shrink the buffer if it's less than 80% full. Need to tune this heuristic! |