Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2061)

Unified Diff: Source/wtf/text/StringBuilder.cpp

Issue 212603003: De-bloat SVGPathStringBuilder (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Generate directly in StringBuilder storage. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/wtf/text/StringBuilder.cpp
diff --git a/Source/wtf/text/StringBuilder.cpp b/Source/wtf/text/StringBuilder.cpp
index 8f3c522bdfdb4b400974d96f1e27837074dd668a..04cccc1c6258cbfc22724f617d258a06fea400cf 100644
--- a/Source/wtf/text/StringBuilder.cpp
+++ b/Source/wtf/text/StringBuilder.cpp
@@ -29,6 +29,7 @@
#include "IntegerToStringConversion.h"
#include "WTFString.h"
+#include "wtf/dtoa.h"
namespace WTF {
@@ -346,6 +347,36 @@ 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;
+ ASSERT(current == buffer);
abarth-chromium 2014/03/28 17:41:43 This ASSERT seems unnecessary. That's the only wa
fs 2014/03/31 07:41:56 Dropped.
+}
+
+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);
abarth-chromium 2014/03/28 17:41:43 Woah
+ }
+ 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!

Powered by Google App Engine
This is Rietveld 408576698