Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 8501) |
+++ src/runtime.cc (working copy) |
@@ -5754,19 +5754,36 @@ |
ASSERT(limit > 0); |
// Collect indices of pattern in subject, and the end-of-string index. |
// Stop after finding at most limit values. |
- StringSearch<PatternChar, SubjectChar> search(isolate, pattern); |
int pattern_length = pattern.length(); |
int index = 0; |
- while (limit > 0) { |
- index = search.Search(subject, index); |
- if (index < 0) return; |
- indices->Add(index); |
- index += pattern_length; |
- limit--; |
+ if (sizeof(SubjectChar) == kCharSize && |
+ sizeof(PatternChar) == kCharSize && |
+ pattern_length == 1) { |
+ // ASCII subject with one char ASCII pattern allows direct use of memchr. |
+ char pattern_first_char = pattern[0]; |
+ const char* subject_start = reinterpret_cast<const char*>(subject.start()); |
+ const char* subject_end = subject_start + subject.length(); |
+ const char* pos = subject_start; |
+ while (limit > 0) { |
+ pos = reinterpret_cast<const char*>( |
+ memchr(pos, pattern_first_char, subject_end - pos)); |
+ if (pos == NULL) return; |
+ indices->Add(pos - subject_start); |
+ pos++; |
+ limit--; |
+ } |
+ } else { |
+ StringSearch<PatternChar, SubjectChar> search(isolate, pattern); |
+ while (limit > 0) { |
+ index = search.Search(subject, index); |
+ if (index < 0) return; |
+ indices->Add(index); |
+ index += pattern_length; |
+ limit--; |
+ } |
} |
} |
- |
RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) { |
ASSERT(args.length() == 3); |
HandleScope handle_scope(isolate); |