Chromium Code Reviews| 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; |