summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/wtf/text/StringBuilder.cpp48
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!