Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index 7689a1acae5591abf2b23adba008e6d451675f4e..d66d67fe33c8db6c5fba17ca7003a782d163b990 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -2507,7 +2507,7 @@ class ReplacementStringBuilder { |
| class CompiledReplacement { |
| public: |
| CompiledReplacement() |
| - : parts_(1), replacement_substrings_(0) {} |
| + : parts_(1), replacement_substrings_(0), simple_hint(false) {} |
| void Compile(Handle<String> replacement, |
| int capture_count, |
| @@ -2523,6 +2523,10 @@ class CompiledReplacement { |
| return parts_.length(); |
| } |
| + int IsSimple() { |
|
Jakob Kummerow
2011/09/07 16:11:24
nit 1: This is C++. We have bools.
nit 2: A simple
|
| + return simple_hint; |
| + } |
| + |
| private: |
| enum PartType { |
| SUBJECT_PREFIX = 1, |
| @@ -2578,18 +2582,21 @@ class CompiledReplacement { |
| // Is replaced by REPLACEMENT_{SUB,}STRING when we create the |
| // substring objects. |
| int data; |
| + |
| }; |
| template<typename Char> |
| - static void ParseReplacementPattern(ZoneList<ReplacementPart>* parts, |
| + static bool ParseReplacementPattern(ZoneList<ReplacementPart>* parts, |
| Vector<Char> characters, |
| int capture_count, |
| int subject_length) { |
| int length = characters.length(); |
| int last = 0; |
| + bool simple = true; |
| for (int i = 0; i < length; i++) { |
| Char c = characters[i]; |
| if (c == '$') { |
| + simple = false; |
| int next_index = i + 1; |
| if (next_index == length) { // No next character! |
| break; |
| @@ -2682,10 +2689,12 @@ class CompiledReplacement { |
| parts->Add(ReplacementPart::ReplacementSubString(last, length)); |
| } |
| } |
| + return simple; |
| } |
| ZoneList<ReplacementPart> parts_; |
| ZoneList<Handle<String> > replacement_substrings_; |
| + bool simple_hint; |
|
Jakob Kummerow
2011/09/07 16:11:24
nit: trailing underscore please
|
| }; |
| @@ -2697,16 +2706,16 @@ void CompiledReplacement::Compile(Handle<String> replacement, |
| String::FlatContent content = replacement->GetFlatContent(); |
| ASSERT(content.IsFlat()); |
| if (content.IsAscii()) { |
| - ParseReplacementPattern(&parts_, |
| - content.ToAsciiVector(), |
| - capture_count, |
| - subject_length); |
| + simple_hint = ParseReplacementPattern(&parts_, |
| + content.ToAsciiVector(), |
| + capture_count, |
| + subject_length); |
| } else { |
| ASSERT(content.IsTwoByte()); |
| - ParseReplacementPattern(&parts_, |
| - content.ToUC16Vector(), |
| - capture_count, |
| - subject_length); |
| + simple_hint = ParseReplacementPattern(&parts_, |
| + content.ToUC16Vector(), |
| + capture_count, |
| + subject_length); |
| } |
| } |
| Isolate* isolate = replacement->GetIsolate(); |
| @@ -2901,7 +2910,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceStringWithString( |
| isolate->factory()->NewRawTwoByteString(result_len)); |
| } |
| - for(int i = 0; i < matches; i++) { |
| + for (int i = 0; i < matches; i++) { |
| // Copy non-matched subject content. |
| String::WriteToFlat(*subject, |
| result->GetChars() + result_pos, |
| @@ -2969,7 +2978,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithString( |
| // Shortcut for simple non-regexp global replacements |
| if (is_global && |
| regexp->TypeTag() == JSRegExp::ATOM && |
| - compiled_replacement.parts() == 1) { |
| + compiled_replacement.IsSimple()) { |
| if (subject_handle->HasOnlyAsciiChars() && |
| replacement_handle->HasOnlyAsciiChars()) { |
| return StringReplaceStringWithString<SeqAsciiString>( |