Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 8507) |
+++ src/runtime.cc (working copy) |
@@ -5745,6 +5745,27 @@ |
} |
+void FindAsciiStringIndices(Vector<const char> subject, |
+ char pattern, |
+ ZoneList<int>* indices, |
+ unsigned int limit) { |
+ ASSERT(limit > 0); |
+ // Collect indices of pattern in subject using memchr. |
+ // Stop after finding at most limit values. |
+ 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, subject_end - pos)); |
+ if (pos == NULL) return; |
+ indices->Add(pos - subject_start); |
+ pos++; |
+ limit--; |
+ } |
+} |
+ |
+ |
template <typename SubjectChar, typename PatternChar> |
void FindStringIndices(Isolate* isolate, |
Vector<const SubjectChar> subject, |
@@ -5752,38 +5773,21 @@ |
ZoneList<int>* indices, |
unsigned int limit) { |
ASSERT(limit > 0); |
- // Collect indices of pattern in subject, and the end-of-string index. |
+ // Collect indices of pattern in subject. |
// Stop after finding at most limit values. |
int pattern_length = pattern.length(); |
int index = 0; |
- 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--; |
- } |
+ 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); |
@@ -5816,11 +5820,19 @@ |
if (subject->IsAsciiRepresentation()) { |
Vector<const char> subject_vector = subject->ToAsciiVector(); |
if (pattern->IsAsciiRepresentation()) { |
- FindStringIndices(isolate, |
- subject_vector, |
- pattern->ToAsciiVector(), |
- &indices, |
- limit); |
+ Vector<const char> pattern_vector = pattern->ToAsciiVector(); |
+ if (pattern_vector.length() == 1) { |
+ FindAsciiStringIndices(subject_vector, |
+ pattern_vector[0], |
+ &indices, |
+ limit); |
+ } else { |
+ FindStringIndices(isolate, |
+ subject_vector, |
+ pattern_vector, |
+ &indices, |
+ limit); |
+ } |
} else { |
FindStringIndices(isolate, |
subject_vector, |