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

Unified Diff: third_party/WebKit/Source/wtf/text/StringBuilder.h

Issue 2033293002: Implement StringImpl sharing for StringView::toString(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix preload scanner bug. Created 4 years, 6 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: third_party/WebKit/Source/wtf/text/StringBuilder.h
diff --git a/third_party/WebKit/Source/wtf/text/StringBuilder.h b/third_party/WebKit/Source/wtf/text/StringBuilder.h
index 4166a553d70c4fd78051c4a7891504488061606e..c967fa6082696ec2c0f232172ddd0837ee13a327 100644
--- a/third_party/WebKit/Source/wtf/text/StringBuilder.h
+++ b/third_party/WebKit/Source/wtf/text/StringBuilder.h
@@ -70,28 +70,42 @@ public:
append(other.characters16(), other.m_length);
}
- // TODO(esprehn): This method is just duplicating what StringView itself
- // does. Remove it and replace callers with append(StringView(string, offset, length)).
+ // NOTE: The semantics of this are different than StringView(..., offset, length)
+ // in that an invalid offset or invalid length is a no-op instead of an
+ // error.
+ // TODO(esprehn): We should probably unify the semantics instead.
void append(const StringView& string, unsigned offset, unsigned length)
{
- if (!string.length())
- return;
-
unsigned extent = offset + length;
if (extent < offset || extent > string.length())
return;
- if (string.is8Bit())
- append(string.characters8() + offset, length);
- else
- append(string.characters16() + offset, length);
+ // We can't do this before the above check since StringView's constructor
+ // doesn't accept invalid offsets or lengths.
+ append(StringView(string, offset, length));
}
void append(const StringView& string)
{
- if (!string.length())
+ if (string.isEmpty())
return;
+ // If we're appending to an empty builder, and there is not a buffer
+ // (reserveCapacity has not been called), then share the impl if
+ // possible.
+ //
+ // This is important to avoid string copies inside dom operations like
+ // Node::textContent when there's only a single Text node child, or
+ // inside the parser in the common case when flushing buffered text to
+ // a Text node.
+ StringImpl* impl = string.sharedImpl();
+ if (!m_length && !m_buffer && impl) {
+ m_string = impl;
haraken 2016/06/06 02:28:52 Don't we need to set m_buffer to impl?
esprehn 2016/06/06 04:42:21 Nope, m_buffer is for when we have an overallocate
+ m_length = impl->length();
+ m_is8Bit = impl->is8Bit();
+ return;
+ }
+
if (string.is8Bit())
append(string.characters8(), string.length());
else

Powered by Google App Engine
This is Rietveld 408576698