OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/conversions-inl.h" | 8 #include "src/conversions-inl.h" |
9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
10 #include "src/messages.h" | 10 #include "src/messages.h" |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 } | 386 } |
387 } | 387 } |
388 | 388 |
389 template <typename ResultSeqString> | 389 template <typename ResultSeqString> |
390 MUST_USE_RESULT static Object* StringReplaceGlobalAtomRegExpWithString( | 390 MUST_USE_RESULT static Object* StringReplaceGlobalAtomRegExpWithString( |
391 Isolate* isolate, Handle<String> subject, Handle<JSRegExp> pattern_regexp, | 391 Isolate* isolate, Handle<String> subject, Handle<JSRegExp> pattern_regexp, |
392 Handle<String> replacement, Handle<JSObject> last_match_info) { | 392 Handle<String> replacement, Handle<JSObject> last_match_info) { |
393 DCHECK(subject->IsFlat()); | 393 DCHECK(subject->IsFlat()); |
394 DCHECK(replacement->IsFlat()); | 394 DCHECK(replacement->IsFlat()); |
395 | 395 |
396 Zone zone(isolate->allocator()); | 396 ZoneScope zone_scope(isolate->runtime_zone()); |
397 ZoneList<int> indices(8, &zone); | 397 ZoneList<int> indices(8, zone_scope.zone()); |
398 DCHECK_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag()); | 398 DCHECK_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag()); |
399 String* pattern = | 399 String* pattern = |
400 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex)); | 400 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex)); |
401 int subject_len = subject->length(); | 401 int subject_len = subject->length(); |
402 int pattern_len = pattern->length(); | 402 int pattern_len = pattern->length(); |
403 int replacement_len = replacement->length(); | 403 int replacement_len = replacement->length(); |
404 | 404 |
405 FindStringIndicesDispatch(isolate, *subject, pattern, &indices, 0xffffffff, | 405 FindStringIndicesDispatch(isolate, *subject, pattern, &indices, 0xffffffff, |
406 &zone); | 406 zone_scope.zone()); |
407 | 407 |
408 int matches = indices.length(); | 408 int matches = indices.length(); |
409 if (matches == 0) return *subject; | 409 if (matches == 0) return *subject; |
410 | 410 |
411 // Detect integer overflow. | 411 // Detect integer overflow. |
412 int64_t result_len_64 = (static_cast<int64_t>(replacement_len) - | 412 int64_t result_len_64 = (static_cast<int64_t>(replacement_len) - |
413 static_cast<int64_t>(pattern_len)) * | 413 static_cast<int64_t>(pattern_len)) * |
414 static_cast<int64_t>(matches) + | 414 static_cast<int64_t>(matches) + |
415 static_cast<int64_t>(subject_len); | 415 static_cast<int64_t>(subject_len); |
416 int result_len; | 416 int result_len; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithString( | 467 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithString( |
468 Isolate* isolate, Handle<String> subject, Handle<JSRegExp> regexp, | 468 Isolate* isolate, Handle<String> subject, Handle<JSRegExp> regexp, |
469 Handle<String> replacement, Handle<JSObject> last_match_info) { | 469 Handle<String> replacement, Handle<JSObject> last_match_info) { |
470 DCHECK(subject->IsFlat()); | 470 DCHECK(subject->IsFlat()); |
471 DCHECK(replacement->IsFlat()); | 471 DCHECK(replacement->IsFlat()); |
472 | 472 |
473 int capture_count = regexp->CaptureCount(); | 473 int capture_count = regexp->CaptureCount(); |
474 int subject_length = subject->length(); | 474 int subject_length = subject->length(); |
475 | 475 |
476 // CompiledReplacement uses zone allocation. | 476 // CompiledReplacement uses zone allocation. |
477 Zone zone(isolate->allocator()); | 477 ZoneScope zone_scope(isolate->runtime_zone()); |
478 CompiledReplacement compiled_replacement(&zone); | 478 CompiledReplacement compiled_replacement(zone_scope.zone()); |
479 bool simple_replace = | 479 bool simple_replace = |
480 compiled_replacement.Compile(replacement, capture_count, subject_length); | 480 compiled_replacement.Compile(replacement, capture_count, subject_length); |
481 | 481 |
482 // Shortcut for simple non-regexp global replacements | 482 // Shortcut for simple non-regexp global replacements |
483 if (regexp->TypeTag() == JSRegExp::ATOM && simple_replace) { | 483 if (regexp->TypeTag() == JSRegExp::ATOM && simple_replace) { |
484 if (subject->HasOnlyOneByteChars() && replacement->HasOnlyOneByteChars()) { | 484 if (subject->HasOnlyOneByteChars() && replacement->HasOnlyOneByteChars()) { |
485 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>( | 485 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>( |
486 isolate, subject, regexp, replacement, last_match_info); | 486 isolate, subject, regexp, replacement, last_match_info); |
487 } else { | 487 } else { |
488 return StringReplaceGlobalAtomRegExpWithString<SeqTwoByteString>( | 488 return StringReplaceGlobalAtomRegExpWithString<SeqTwoByteString>( |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 | 704 |
705 // The limit can be very large (0xffffffffu), but since the pattern | 705 // The limit can be very large (0xffffffffu), but since the pattern |
706 // isn't empty, we can never create more parts than ~half the length | 706 // isn't empty, we can never create more parts than ~half the length |
707 // of the subject. | 707 // of the subject. |
708 | 708 |
709 subject = String::Flatten(subject); | 709 subject = String::Flatten(subject); |
710 pattern = String::Flatten(pattern); | 710 pattern = String::Flatten(pattern); |
711 | 711 |
712 static const int kMaxInitialListCapacity = 16; | 712 static const int kMaxInitialListCapacity = 16; |
713 | 713 |
714 Zone zone(isolate->allocator()); | 714 ZoneScope zone_scope(isolate->runtime_zone()); |
715 | 715 |
716 // Find (up to limit) indices of separator and end-of-string in subject | 716 // Find (up to limit) indices of separator and end-of-string in subject |
717 int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit); | 717 int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit); |
718 ZoneList<int> indices(initial_capacity, &zone); | 718 ZoneList<int> indices(initial_capacity, zone_scope.zone()); |
719 | 719 |
720 FindStringIndicesDispatch(isolate, *subject, *pattern, &indices, limit, | 720 FindStringIndicesDispatch(isolate, *subject, *pattern, &indices, limit, |
721 &zone); | 721 zone_scope.zone()); |
722 | 722 |
723 if (static_cast<uint32_t>(indices.length()) < limit) { | 723 if (static_cast<uint32_t>(indices.length()) < limit) { |
724 indices.Add(subject_length, &zone); | 724 indices.Add(subject_length, zone_scope.zone()); |
725 } | 725 } |
726 | 726 |
727 // The list indices now contains the end of each part to create. | 727 // The list indices now contains the end of each part to create. |
728 | 728 |
729 // Create JSArray of substrings separated by separator. | 729 // Create JSArray of substrings separated by separator. |
730 int part_count = indices.length(); | 730 int part_count = indices.length(); |
731 | 731 |
732 Handle<JSArray> result = | 732 Handle<JSArray> result = |
733 isolate->factory()->NewJSArray(FAST_ELEMENTS, part_count, part_count, | 733 isolate->factory()->NewJSArray(FAST_ELEMENTS, part_count, part_count, |
734 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); | 734 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 | 1013 |
1014 | 1014 |
1015 RUNTIME_FUNCTION(Runtime_IsRegExp) { | 1015 RUNTIME_FUNCTION(Runtime_IsRegExp) { |
1016 SealHandleScope shs(isolate); | 1016 SealHandleScope shs(isolate); |
1017 DCHECK(args.length() == 1); | 1017 DCHECK(args.length() == 1); |
1018 CONVERT_ARG_CHECKED(Object, obj, 0); | 1018 CONVERT_ARG_CHECKED(Object, obj, 0); |
1019 return isolate->heap()->ToBoolean(obj->IsJSRegExp()); | 1019 return isolate->heap()->ToBoolean(obj->IsJSRegExp()); |
1020 } | 1020 } |
1021 } // namespace internal | 1021 } // namespace internal |
1022 } // namespace v8 | 1022 } // namespace v8 |
OLD | NEW |