Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 538986d2d1039d62df1bbaf385935b8c2d14eca0..bc0a82e6868ab16718f6c71451bf24e355134e61 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -6862,10 +6862,21 @@ void String::WriteToFlat(String* src, |
// Left hand side is longer. Recurse over right. |
if (to > boundary) { |
String* second = cons_string->second(); |
- WriteToFlat(second, |
- sink + boundary - from, |
- 0, |
+ // When repeatedly appending to a string, we get a cons string that |
+ // is unbalanced to the left, a list, essentially. We inline the |
+ // common case of sequential ascii right child. |
+ if (to - boundary == 1) { |
+ sink[boundary - from] = static_cast<sinkchar>(second->Get(0)); |
piscisaureus
2012/05/08 00:00:09
MSVC refuses to inline the Get(0) call. My benchma
|
+ } else if (second->IsSeqAsciiString()) { |
+ CopyChars(sink + boundary - from, |
piscisaureus
2012/05/08 00:00:09
Ditto.
|
+ SeqAsciiString::cast(second)->GetChars(), |
to - boundary); |
+ } else { |
+ WriteToFlat(second, |
+ sink + boundary - from, |
+ 0, |
+ to - boundary); |
+ } |
to = boundary; |
} |
source = first; |