Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 8350) |
+++ src/runtime.cc (working copy) |
@@ -3146,9 +3146,9 @@ |
ZoneScope zone_space(isolate, DELETE_ON_EXIT); |
ZoneList<int> offsets(8); |
+ int start; |
+ int end; |
do { |
- int start; |
- int end; |
{ |
AssertNoAllocation no_alloc; |
FixedArray* elements = FixedArray::cast(regexp_info->elements()); |
@@ -3157,20 +3157,23 @@ |
} |
offsets.Add(start); |
offsets.Add(end); |
- int index = start < end ? end : end + 1; |
- if (index > length) break; |
- match = RegExpImpl::Exec(regexp, subject, index, regexp_info); |
+ if (start == end) if (++end > length) break; |
+ match = RegExpImpl::Exec(regexp, subject, end, regexp_info); |
if (match.is_null()) { |
return Failure::Exception(); |
} |
} while (!match->IsNull()); |
int matches = offsets.length() / 2; |
Handle<FixedArray> elements = isolate->factory()->NewFixedArray(matches); |
- for (int i = 0; i < matches ; i++) { |
+ Handle<String> substring = isolate->factory()-> |
+ NewSubString(subject, offsets.at(0), offsets.at(1)); |
+ elements->set(0, *substring); |
+ for (int i = 1; i < matches ; i++) { |
int from = offsets.at(i * 2); |
int to = offsets.at(i * 2 + 1); |
- Handle<String> match = isolate->factory()->NewSubString(subject, from, to); |
- elements->set(i, *match); |
+ Handle<String> substring = isolate->factory()-> |
+ NewStrictSubString(subject, from, to); |
+ elements->set(i, *substring); |
} |
Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(elements); |
result->set_length(Smi::FromInt(matches)); |
@@ -3320,6 +3323,7 @@ |
OffsetsVector registers(required_registers); |
Vector<int32_t> register_vector(registers.vector(), registers.length()); |
int subject_length = subject->length(); |
+ bool first = true; |
for (;;) { // Break on failure, return on exception. |
RegExpImpl::IrregexpResult result = |
@@ -3337,9 +3341,15 @@ |
} |
match_end = register_vector[1]; |
HandleScope loop_scope(isolate); |
- builder->Add(*isolate->factory()->NewSubString(subject, |
- match_start, |
- match_end)); |
+ if (!first) { |
+ builder->Add(*isolate->factory()->NewStrictSubString(subject, |
+ match_start, |
+ match_end)); |
+ } else { |
+ builder->Add(*isolate->factory()->NewSubString(subject, |
+ match_start, |
+ match_end)); |
+ } |
if (match_start != match_end) { |
pos = match_end; |
} else { |
@@ -3352,6 +3362,7 @@ |
ASSERT_EQ(result, RegExpImpl::RE_EXCEPTION); |
return result; |
} |
+ first = false; |
} |
if (match_start >= 0) { |
@@ -3403,7 +3414,7 @@ |
// at the end, so we have two vectors that we swap between. |
OffsetsVector registers2(required_registers); |
Vector<int> prev_register_vector(registers2.vector(), registers2.length()); |
- |
+ bool first = true; |
do { |
int match_start = register_vector[0]; |
builder->EnsureCapacity(kMaxBuilderEntriesPerRegExpMatch); |
@@ -3421,18 +3432,30 @@ |
// subject, i.e., 3 + capture count in total. |
Handle<FixedArray> elements = |
isolate->factory()->NewFixedArray(3 + capture_count); |
- Handle<String> match = isolate->factory()->NewSubString(subject, |
- match_start, |
- match_end); |
+ Handle<String> match; |
+ if (!first) { |
+ match = isolate->factory()->NewStrictSubString(subject, |
+ match_start, |
+ match_end); |
+ } else { |
+ match = isolate->factory()->NewSubString(subject, |
+ match_start, |
+ match_end); |
+ } |
elements->set(0, *match); |
for (int i = 1; i <= capture_count; i++) { |
int start = register_vector[i * 2]; |
if (start >= 0) { |
int end = register_vector[i * 2 + 1]; |
ASSERT(start <= end); |
- Handle<String> substring = isolate->factory()->NewSubString(subject, |
- start, |
- end); |
+ Handle<String> substring; |
+ if (!first) { |
+ substring = isolate->factory()->NewStrictSubString(subject, |
+ start, |
+ end); |
+ } else { |
+ substring = isolate->factory()->NewSubString(subject, start, end); |
+ } |
elements->set(i, *substring); |
} else { |
ASSERT(register_vector[i * 2 + 1] < 0); |
@@ -3462,6 +3485,7 @@ |
subject, |
pos, |
register_vector); |
+ first = false; |
} while (result == RegExpImpl::RE_SUCCESS); |
if (result != RegExpImpl::RE_EXCEPTION) { |
@@ -5830,7 +5854,7 @@ |
HandleScope local_loop_handle; |
int part_end = indices.at(i); |
Handle<String> substring = |
- isolate->factory()->NewSubString(subject, part_start, part_end); |
+ isolate->factory()->NewStrictSubString(subject, part_start, part_end); |
elements->set(i, *substring); |
part_start = part_end + pattern_length; |
} |