Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index a0f26fc240f0cca8db1fcf67ca9515ce4f3ccf26..22e80b33e0bbe253cd3b563619550cdf4c1920f9 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -2782,13 +2782,17 @@ int Runtime::StringMatch(Handle<String> sub, |
// algorithm is unnecessary overhead. |
if (pattern_length == 1) { |
AssertNoAllocation no_heap_allocation; // ensure vectors stay valid |
- if (sub->IsAsciiRepresentation()) { |
+ String* seq_sub = *sub; |
+ if (seq_sub->IsConsString()) { |
+ seq_sub = ConsString::cast(seq_sub)->first(); |
+ } |
+ if (seq_sub->IsAsciiRepresentation()) { |
uc16 pchar = pat->Get(0); |
if (pchar > String::kMaxAsciiCharCode) { |
return -1; |
} |
Vector<const char> ascii_vector = |
- sub->ToAsciiVector().SubVector(start_index, subject_length); |
+ seq_sub->ToAsciiVector().SubVector(start_index, subject_length); |
const void* pos = memchr(ascii_vector.start(), |
static_cast<const char>(pchar), |
static_cast<size_t>(ascii_vector.length())); |
@@ -2798,7 +2802,9 @@ int Runtime::StringMatch(Handle<String> sub, |
return static_cast<int>(reinterpret_cast<const char*>(pos) |
- ascii_vector.start() + start_index); |
} |
- return SingleCharIndexOf(sub->ToUC16Vector(), pat->Get(0), start_index); |
+ return SingleCharIndexOf(seq_sub->ToUC16Vector(), |
+ pat->Get(0), |
+ start_index); |
} |
if (!pat->IsFlat()) { |
@@ -2806,19 +2812,29 @@ int Runtime::StringMatch(Handle<String> sub, |
} |
AssertNoAllocation no_heap_allocation; // ensure vectors stay valid |
+ // Extract flattened substrings of cons strings before determining asciiness. |
+ String* seq_sub = *sub; |
+ if (seq_sub->IsConsString()) { |
+ seq_sub = ConsString::cast(seq_sub)->first(); |
+ } |
+ String* seq_pat = *pat; |
+ if (seq_pat->IsConsString()) { |
+ seq_pat = ConsString::cast(seq_pat)->first(); |
+ } |
+ |
// dispatch on type of strings |
- if (pat->IsAsciiRepresentation()) { |
- Vector<const char> pat_vector = pat->ToAsciiVector(); |
- if (sub->IsAsciiRepresentation()) { |
- return StringSearch(sub->ToAsciiVector(), pat_vector, start_index); |
+ 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 StringSearch(sub->ToUC16Vector(), pat_vector, start_index); |
+ return StringSearch(seq_sub->ToUC16Vector(), pat_vector, start_index); |
} |
- Vector<const uc16> pat_vector = pat->ToUC16Vector(); |
- if (sub->IsAsciiRepresentation()) { |
- return StringSearch(sub->ToAsciiVector(), 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 StringSearch(sub->ToUC16Vector(), pat_vector, start_index); |
+ return StringSearch(seq_sub->ToUC16Vector(), pat_vector, start_index); |
} |