| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index dd922ed8cd6dee1e687f5e2584a7b84e4dd88469..1033075edb6d10d37de4da77570b88b175c14a82 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -2624,15 +2624,15 @@ int Runtime::StringMatch(Handle<String> sub,
|
| if (seq_pat->IsAsciiRepresentation()) {
|
| Vector<const char> pat_vector = seq_pat->ToAsciiVector();
|
| if (seq_sub->IsAsciiRepresentation()) {
|
| - return StringSearch(seq_sub->ToAsciiVector(), pat_vector, start_index);
|
| + return SearchString(seq_sub->ToAsciiVector(), pat_vector, start_index);
|
| }
|
| - return StringSearch(seq_sub->ToUC16Vector(), pat_vector, start_index);
|
| + return SearchString(seq_sub->ToUC16Vector(), pat_vector, start_index);
|
| }
|
| Vector<const uc16> pat_vector = seq_pat->ToUC16Vector();
|
| if (seq_sub->IsAsciiRepresentation()) {
|
| - return StringSearch(seq_sub->ToAsciiVector(), pat_vector, start_index);
|
| + return SearchString(seq_sub->ToAsciiVector(), pat_vector, start_index);
|
| }
|
| - return StringSearch(seq_sub->ToUC16Vector(), pat_vector, start_index);
|
| + return SearchString(seq_sub->ToUC16Vector(), pat_vector, start_index);
|
| }
|
|
|
|
|
| @@ -2889,67 +2889,39 @@ static void SetLastMatchInfoNoCaptures(Handle<String> subject,
|
| }
|
|
|
|
|
| -template <typename schar, typename pchar>
|
| -static bool SearchStringMultiple(Vector<schar> subject,
|
| - String* pattern,
|
| - Vector<pchar> pattern_string,
|
| +template <typename SubjectChar, typename PatternChar>
|
| +static bool SearchStringMultiple(Vector<const SubjectChar> subject,
|
| + Vector<const PatternChar> pattern,
|
| + String* pattern_string,
|
| FixedArrayBuilder* builder,
|
| int* match_pos) {
|
| int pos = *match_pos;
|
| int subject_length = subject.length();
|
| - int pattern_length = pattern_string.length();
|
| + int pattern_length = pattern.length();
|
| int max_search_start = subject_length - pattern_length;
|
| - bool is_ascii = (sizeof(schar) == 1);
|
| - StringSearchStrategy strategy =
|
| - InitializeStringSearch(pattern_string, is_ascii);
|
| - switch (strategy) {
|
| - case SEARCH_FAIL: break;
|
| - case SEARCH_SHORT:
|
| - while (pos <= max_search_start) {
|
| - if (!builder->HasCapacity(kMaxBuilderEntriesPerRegExpMatch)) {
|
| - *match_pos = pos;
|
| - return false;
|
| - }
|
| - // Position of end of previous match.
|
| - int match_end = pos + pattern_length;
|
| - int new_pos = SimpleIndexOf(subject, pattern_string, match_end);
|
| - if (new_pos >= 0) {
|
| - // A match.
|
| - if (new_pos > match_end) {
|
| - ReplacementStringBuilder::AddSubjectSlice(builder,
|
| - match_end,
|
| - new_pos);
|
| - }
|
| - pos = new_pos;
|
| - builder->Add(pattern);
|
| - } else {
|
| - break;
|
| - }
|
| - }
|
| - break;
|
| - case SEARCH_LONG:
|
| - while (pos <= max_search_start) {
|
| - if (!builder->HasCapacity(kMaxBuilderEntriesPerRegExpMatch)) {
|
| - *match_pos = pos;
|
| - return false;
|
| - }
|
| - int match_end = pos + pattern_length;
|
| - int new_pos = ComplexIndexOf(subject, pattern_string, match_end);
|
| - if (new_pos >= 0) {
|
| - // A match has been found.
|
| - if (new_pos > match_end) {
|
| - ReplacementStringBuilder::AddSubjectSlice(builder,
|
| - match_end,
|
| - new_pos);
|
| - }
|
| - pos = new_pos;
|
| - builder->Add(pattern);
|
| - } else {
|
| - break;
|
| - }
|
| + StringSearch<PatternChar, SubjectChar> search(pattern);
|
| + while (pos <= max_search_start) {
|
| + if (!builder->HasCapacity(kMaxBuilderEntriesPerRegExpMatch)) {
|
| + *match_pos = pos;
|
| + return false;
|
| + }
|
| + // Position of end of previous match.
|
| + int match_end = pos + pattern_length;
|
| + int new_pos = search.Search(subject, match_end);
|
| + if (new_pos >= 0) {
|
| + // A match.
|
| + if (new_pos > match_end) {
|
| + ReplacementStringBuilder::AddSubjectSlice(builder,
|
| + match_end,
|
| + new_pos);
|
| }
|
| + pos = new_pos;
|
| + builder->Add(pattern_string);
|
| + } else {
|
| break;
|
| + }
|
| }
|
| +
|
| if (pos < max_search_start) {
|
| ReplacementStringBuilder::AddSubjectSlice(builder,
|
| pos + pattern_length,
|
| @@ -2977,14 +2949,14 @@ static bool SearchStringMultiple(Handle<String> subject,
|
| Vector<const char> subject_vector = subject->ToAsciiVector();
|
| if (pattern->IsAsciiRepresentation()) {
|
| if (SearchStringMultiple(subject_vector,
|
| - *pattern,
|
| pattern->ToAsciiVector(),
|
| + *pattern,
|
| builder,
|
| &match_pos)) break;
|
| } else {
|
| if (SearchStringMultiple(subject_vector,
|
| - *pattern,
|
| pattern->ToUC16Vector(),
|
| + *pattern,
|
| builder,
|
| &match_pos)) break;
|
| }
|
| @@ -2992,14 +2964,14 @@ static bool SearchStringMultiple(Handle<String> subject,
|
| Vector<const uc16> subject_vector = subject->ToUC16Vector();
|
| if (pattern->IsAsciiRepresentation()) {
|
| if (SearchStringMultiple(subject_vector,
|
| - *pattern,
|
| pattern->ToAsciiVector(),
|
| + *pattern,
|
| builder,
|
| &match_pos)) break;
|
| } else {
|
| if (SearchStringMultiple(subject_vector,
|
| - *pattern,
|
| pattern->ToUC16Vector(),
|
| + *pattern,
|
| builder,
|
| &match_pos)) break;
|
| }
|
| @@ -4781,51 +4753,23 @@ static Object* Runtime_StringTrim(Arguments args) {
|
| }
|
|
|
|
|
| -// Define storage for buffers declared in header file.
|
| -// TODO(lrn): Remove these when rewriting search code.
|
| -int BMBuffers::bad_char_occurrence[kBMAlphabetSize];
|
| -BMGoodSuffixBuffers BMBuffers::bmgs_buffers;
|
| -
|
| -
|
| -template <typename schar, typename pchar>
|
| -void FindStringIndices(Vector<const schar> subject,
|
| - Vector<const pchar> pattern,
|
| +template <typename SubjectChar, typename PatternChar>
|
| +void FindStringIndices(Vector<const SubjectChar> subject,
|
| + Vector<const PatternChar> pattern,
|
| ZoneList<int>* indices,
|
| unsigned int limit) {
|
| ASSERT(limit > 0);
|
| // Collect indices of pattern in subject, and the end-of-string index.
|
| // Stop after finding at most limit values.
|
| - StringSearchStrategy strategy =
|
| - InitializeStringSearch(pattern, sizeof(schar) == 1);
|
| - switch (strategy) {
|
| - case SEARCH_FAIL: return;
|
| - case SEARCH_SHORT: {
|
| - int pattern_length = pattern.length();
|
| - int index = 0;
|
| - while (limit > 0) {
|
| - index = SimpleIndexOf(subject, pattern, index);
|
| - if (index < 0) return;
|
| - indices->Add(index);
|
| - index += pattern_length;
|
| - limit--;
|
| - }
|
| - return;
|
| - }
|
| - case SEARCH_LONG: {
|
| - int pattern_length = pattern.length();
|
| - int index = 0;
|
| - while (limit > 0) {
|
| - index = ComplexIndexOf(subject, pattern, index);
|
| - if (index < 0) return;
|
| - indices->Add(index);
|
| - index += pattern_length;
|
| - limit--;
|
| - }
|
| - return;
|
| - }
|
| - default:
|
| - UNREACHABLE();
|
| - return;
|
| + StringSearch<PatternChar, SubjectChar> search(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--;
|
| }
|
| }
|
|
|
|
|