 Chromium Code Reviews
 Chromium Code Reviews Issue 1418703003:
  RegExp: remove last match info override.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1418703003:
  RegExp: remove last match info override.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/runtime/runtime-regexp.cc | 
| diff --git a/src/runtime/runtime-regexp.cc b/src/runtime/runtime-regexp.cc | 
| index 48154ea275122dd8471dc238af2286f85f41ccd9..4f59ef931f9336079a7e5959dd4ac4848a741475 100644 | 
| --- a/src/runtime/runtime-regexp.cc | 
| +++ b/src/runtime/runtime-regexp.cc | 
| @@ -693,8 +693,10 @@ RUNTIME_FUNCTION(Runtime_StringSplit) { | 
| RUNTIME_ASSERT(pattern_length > 0); | 
| if (limit == 0xffffffffu) { | 
| + FixedArray* last_match_cache_unused; | 
| Handle<Object> cached_answer( | 
| RegExpResultsCache::Lookup(isolate->heap(), *subject, *pattern, | 
| + &last_match_cache_unused, | 
| RegExpResultsCache::STRING_SPLIT_SUBSTRINGS), | 
| isolate); | 
| if (*cached_answer != Smi::FromInt(0)) { | 
| @@ -757,6 +759,7 @@ RUNTIME_FUNCTION(Runtime_StringSplit) { | 
| if (limit == 0xffffffffu) { | 
| if (result->HasFastObjectElements()) { | 
| RegExpResultsCache::Enter(isolate, subject, pattern, elements, | 
| + isolate->factory()->empty_fixed_array(), | 
| RegExpResultsCache::STRING_SPLIT_SUBSTRINGS); | 
| } | 
| } | 
| @@ -1017,23 +1020,23 @@ static Object* SearchRegExpMultiple(Isolate* isolate, Handle<String> subject, | 
| static const int kMinLengthToCache = 0x1000; | 
| if (subject_length > kMinLengthToCache) { | 
| - Handle<Object> cached_answer( | 
| - RegExpResultsCache::Lookup(isolate->heap(), *subject, regexp->data(), | 
| - RegExpResultsCache::REGEXP_MULTIPLE_INDICES), | 
| - isolate); | 
| - if (*cached_answer != Smi::FromInt(0)) { | 
| + FixedArray* last_match_cache; | 
| + Object* cached_answer = RegExpResultsCache::Lookup( | 
| + isolate->heap(), *subject, regexp->data(), &last_match_cache, | 
| + RegExpResultsCache::REGEXP_MULTIPLE_INDICES); | 
| + if (cached_answer->IsFixedArray()) { | 
| + int capture_registers = (capture_count + 1) * 2; | 
| + int32_t* last_match = NewArray<int32_t>(capture_registers); | 
| + for (int i = 0; i < capture_registers; i++) { | 
| + last_match[i] = Smi::cast(last_match_cache->get(i))->value(); | 
| + } | 
| Handle<FixedArray> cached_fixed_array = | 
| - Handle<FixedArray>(FixedArray::cast(*cached_answer)); | 
| + Handle<FixedArray>(FixedArray::cast(cached_answer)); | 
| // The cache FixedArray is a COW-array and can therefore be reused. | 
| JSArray::SetContent(result_array, cached_fixed_array); | 
| - // The actual length of the result array is stored in the last element of | 
| - // the backing store (the backing FixedArray may have a larger capacity). | 
| - Object* cached_fixed_array_last_element = | 
| - cached_fixed_array->get(cached_fixed_array->length() - 1); | 
| - Smi* js_array_length = Smi::cast(cached_fixed_array_last_element); | 
| - result_array->set_length(js_array_length); | 
| RegExpImpl::SetLastMatchInfo(last_match_array, subject, capture_count, | 
| - NULL); | 
| + last_match); | 
| + DeleteArray(last_match); | 
| return *result_array; | 
| } | 
| } | 
| @@ -1121,19 +1124,24 @@ static Object* SearchRegExpMultiple(Isolate* isolate, Handle<String> subject, | 
| } | 
| RegExpImpl::SetLastMatchInfo(last_match_array, subject, capture_count, | 
| - NULL); | 
| + global_cache.LastSuccessfulMatch()); | 
| if (subject_length > kMinLengthToCache) { | 
| - // Store the length of the result array into the last element of the | 
| - // backing FixedArray. | 
| - builder.EnsureCapacity(1); | 
| - Handle<FixedArray> fixed_array = builder.array(); | 
| - fixed_array->set(fixed_array->length() - 1, | 
| - Smi::FromInt(builder.length())); | 
| + // Store the last successful match into the array for caching. | 
| + // TODO(yangguo): do not expose last match to JS and simplify caching. | 
| + int capture_registers = (capture_count + 1) * 2; | 
| + Handle<FixedArray> last_match_cache = | 
| + isolate->factory()->NewFixedArray(capture_registers); | 
| + int32_t* last_match = global_cache.LastSuccessfulMatch(); | 
| + for (int i = 0; i < capture_registers; i++) { | 
| + last_match_cache->set(i, Smi::FromInt(last_match[i])); | 
| + } | 
| + Handle<FixedArray> result_array = builder.array(); | 
| 
brucedawson
2015/10/28 17:19:36
I'm worried about this variable declaration. The r
 
Yang
2015/10/29 12:55:27
Thanks. See https://codereview.chromium.org/140721
 | 
| + result_array->Shrink(builder.length()); | 
| // Cache the result and turn the FixedArray into a COW array. | 
| - RegExpResultsCache::Enter(isolate, subject, | 
| - handle(regexp->data(), isolate), fixed_array, | 
| - RegExpResultsCache::REGEXP_MULTIPLE_INDICES); | 
| + RegExpResultsCache::Enter( | 
| + isolate, subject, handle(regexp->data(), isolate), result_array, | 
| + last_match_cache, RegExpResultsCache::REGEXP_MULTIPLE_INDICES); | 
| } | 
| return *builder.ToJSArray(result_array); | 
| } else { | 
| @@ -1149,8 +1157,8 @@ RUNTIME_FUNCTION(Runtime_RegExpExecMultiple) { | 
| HandleScope handles(isolate); | 
| DCHECK(args.length() == 4); | 
| - CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); | 
| CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); | 
| + CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); | 
| CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2); | 
| CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3); | 
| RUNTIME_ASSERT(last_match_info->HasFastObjectElements()); |