| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index c8ad03057c47a55f1658ecc024867c09d52865ce..9ab86f3e14617fb95bc4983c17e9750a1f70427a 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -2528,8 +2528,10 @@ class ReplacementStringBuilder {
|
|
|
| class CompiledReplacement {
|
| public:
|
| - CompiledReplacement()
|
| - : parts_(1), replacement_substrings_(0), simple_hint_(false) {}
|
| + explicit CompiledReplacement(Zone* zone)
|
| + : parts_(1, zone), replacement_substrings_(0, zone),
|
| + simple_hint_(false),
|
| + zone_(zone) {}
|
|
|
| void Compile(Handle<String> replacement,
|
| int capture_count,
|
| @@ -2549,6 +2551,8 @@ class CompiledReplacement {
|
| return simple_hint_;
|
| }
|
|
|
| + Zone* zone() const { return zone_; }
|
| +
|
| private:
|
| enum PartType {
|
| SUBJECT_PREFIX = 1,
|
| @@ -2610,7 +2614,8 @@ class CompiledReplacement {
|
| static bool ParseReplacementPattern(ZoneList<ReplacementPart>* parts,
|
| Vector<Char> characters,
|
| int capture_count,
|
| - int subject_length) {
|
| + int subject_length,
|
| + Zone* zone) {
|
| int length = characters.length();
|
| int last = 0;
|
| for (int i = 0; i < length; i++) {
|
| @@ -2625,7 +2630,8 @@ class CompiledReplacement {
|
| case '$':
|
| if (i > last) {
|
| // There is a substring before. Include the first "$".
|
| - parts->Add(ReplacementPart::ReplacementSubString(last, next_index));
|
| + parts->Add(ReplacementPart::ReplacementSubString(last, next_index),
|
| + zone);
|
| last = next_index + 1; // Continue after the second "$".
|
| } else {
|
| // Let the next substring start with the second "$".
|
| @@ -2635,25 +2641,25 @@ class CompiledReplacement {
|
| break;
|
| case '`':
|
| if (i > last) {
|
| - parts->Add(ReplacementPart::ReplacementSubString(last, i));
|
| + parts->Add(ReplacementPart::ReplacementSubString(last, i), zone);
|
| }
|
| - parts->Add(ReplacementPart::SubjectPrefix());
|
| + parts->Add(ReplacementPart::SubjectPrefix(), zone);
|
| i = next_index;
|
| last = i + 1;
|
| break;
|
| case '\'':
|
| if (i > last) {
|
| - parts->Add(ReplacementPart::ReplacementSubString(last, i));
|
| + parts->Add(ReplacementPart::ReplacementSubString(last, i), zone);
|
| }
|
| - parts->Add(ReplacementPart::SubjectSuffix(subject_length));
|
| + parts->Add(ReplacementPart::SubjectSuffix(subject_length), zone);
|
| i = next_index;
|
| last = i + 1;
|
| break;
|
| case '&':
|
| if (i > last) {
|
| - parts->Add(ReplacementPart::ReplacementSubString(last, i));
|
| + parts->Add(ReplacementPart::ReplacementSubString(last, i), zone);
|
| }
|
| - parts->Add(ReplacementPart::SubjectMatch());
|
| + parts->Add(ReplacementPart::SubjectMatch(), zone);
|
| i = next_index;
|
| last = i + 1;
|
| break;
|
| @@ -2686,10 +2692,10 @@ class CompiledReplacement {
|
| }
|
| if (capture_ref > 0) {
|
| if (i > last) {
|
| - parts->Add(ReplacementPart::ReplacementSubString(last, i));
|
| + parts->Add(ReplacementPart::ReplacementSubString(last, i), zone);
|
| }
|
| ASSERT(capture_ref <= capture_count);
|
| - parts->Add(ReplacementPart::SubjectCapture(capture_ref));
|
| + parts->Add(ReplacementPart::SubjectCapture(capture_ref), zone);
|
| last = next_index + 1;
|
| }
|
| i = next_index;
|
| @@ -2703,10 +2709,10 @@ class CompiledReplacement {
|
| }
|
| if (length > last) {
|
| if (last == 0) {
|
| - parts->Add(ReplacementPart::ReplacementString());
|
| + parts->Add(ReplacementPart::ReplacementString(), zone);
|
| return true;
|
| } else {
|
| - parts->Add(ReplacementPart::ReplacementSubString(last, length));
|
| + parts->Add(ReplacementPart::ReplacementSubString(last, length), zone);
|
| }
|
| }
|
| return false;
|
| @@ -2715,6 +2721,7 @@ class CompiledReplacement {
|
| ZoneList<ReplacementPart> parts_;
|
| ZoneList<Handle<String> > replacement_substrings_;
|
| bool simple_hint_;
|
| + Zone* zone_;
|
| };
|
|
|
|
|
| @@ -2729,13 +2736,15 @@ void CompiledReplacement::Compile(Handle<String> replacement,
|
| simple_hint_ = ParseReplacementPattern(&parts_,
|
| content.ToAsciiVector(),
|
| capture_count,
|
| - subject_length);
|
| + subject_length,
|
| + zone());
|
| } else {
|
| ASSERT(content.IsTwoByte());
|
| simple_hint_ = ParseReplacementPattern(&parts_,
|
| content.ToUC16Vector(),
|
| capture_count,
|
| - subject_length);
|
| + subject_length,
|
| + zone());
|
| }
|
| }
|
| Isolate* isolate = replacement->GetIsolate();
|
| @@ -2747,12 +2756,12 @@ void CompiledReplacement::Compile(Handle<String> replacement,
|
| int from = -tag;
|
| int to = parts_[i].data;
|
| replacement_substrings_.Add(
|
| - isolate->factory()->NewSubString(replacement, from, to));
|
| + isolate->factory()->NewSubString(replacement, from, to), zone());
|
| parts_[i].tag = REPLACEMENT_SUBSTRING;
|
| parts_[i].data = substring_index;
|
| substring_index++;
|
| } else if (tag == REPLACEMENT_STRING) {
|
| - replacement_substrings_.Add(replacement);
|
| + replacement_substrings_.Add(replacement, zone());
|
| parts_[i].data = substring_index;
|
| substring_index++;
|
| }
|
| @@ -2801,7 +2810,8 @@ void CompiledReplacement::Apply(ReplacementStringBuilder* builder,
|
| void FindAsciiStringIndices(Vector<const char> subject,
|
| char pattern,
|
| ZoneList<int>* indices,
|
| - unsigned int limit) {
|
| + unsigned int limit,
|
| + Zone* zone) {
|
| ASSERT(limit > 0);
|
| // Collect indices of pattern in subject using memchr.
|
| // Stop after finding at most limit values.
|
| @@ -2812,7 +2822,7 @@ void FindAsciiStringIndices(Vector<const char> subject,
|
| pos = reinterpret_cast<const char*>(
|
| memchr(pos, pattern, subject_end - pos));
|
| if (pos == NULL) return;
|
| - indices->Add(static_cast<int>(pos - subject_start));
|
| + indices->Add(static_cast<int>(pos - subject_start), zone);
|
| pos++;
|
| limit--;
|
| }
|
| @@ -2824,7 +2834,8 @@ void FindStringIndices(Isolate* isolate,
|
| Vector<const SubjectChar> subject,
|
| Vector<const PatternChar> pattern,
|
| ZoneList<int>* indices,
|
| - unsigned int limit) {
|
| + unsigned int limit,
|
| + Zone* zone) {
|
| ASSERT(limit > 0);
|
| // Collect indices of pattern in subject.
|
| // Stop after finding at most limit values.
|
| @@ -2834,7 +2845,7 @@ void FindStringIndices(Isolate* isolate,
|
| while (limit > 0) {
|
| index = search.Search(subject, index);
|
| if (index < 0) return;
|
| - indices->Add(index);
|
| + indices->Add(index, zone);
|
| index += pattern_length;
|
| limit--;
|
| }
|
| @@ -2845,7 +2856,8 @@ void FindStringIndicesDispatch(Isolate* isolate,
|
| String* subject,
|
| String* pattern,
|
| ZoneList<int>* indices,
|
| - unsigned int limit) {
|
| + unsigned int limit,
|
| + Zone* zone) {
|
| {
|
| AssertNoAllocation no_gc;
|
| String::FlatContent subject_content = subject->GetFlatContent();
|
| @@ -2860,20 +2872,23 @@ void FindStringIndicesDispatch(Isolate* isolate,
|
| FindAsciiStringIndices(subject_vector,
|
| pattern_vector[0],
|
| indices,
|
| - limit);
|
| + limit,
|
| + zone);
|
| } else {
|
| FindStringIndices(isolate,
|
| subject_vector,
|
| pattern_vector,
|
| indices,
|
| - limit);
|
| + limit,
|
| + zone);
|
| }
|
| } else {
|
| FindStringIndices(isolate,
|
| subject_vector,
|
| pattern_content.ToUC16Vector(),
|
| indices,
|
| - limit);
|
| + limit,
|
| + zone);
|
| }
|
| } else {
|
| Vector<const uc16> subject_vector = subject_content.ToUC16Vector();
|
| @@ -2882,13 +2897,15 @@ void FindStringIndicesDispatch(Isolate* isolate,
|
| subject_vector,
|
| pattern_content.ToAsciiVector(),
|
| indices,
|
| - limit);
|
| + limit,
|
| + zone);
|
| } else {
|
| FindStringIndices(isolate,
|
| subject_vector,
|
| pattern_content.ToUC16Vector(),
|
| indices,
|
| - limit);
|
| + limit,
|
| + zone);
|
| }
|
| }
|
| }
|
| @@ -2967,12 +2984,13 @@ MUST_USE_RESULT static MaybeObject* StringReplaceAtomRegExpWithString(
|
| Handle<String> subject,
|
| Handle<JSRegExp> pattern_regexp,
|
| Handle<String> replacement,
|
| - Handle<JSArray> last_match_info) {
|
| + Handle<JSArray> last_match_info,
|
| + Zone* zone) {
|
| ASSERT(subject->IsFlat());
|
| ASSERT(replacement->IsFlat());
|
|
|
| ZoneScope zone_space(isolate, DELETE_ON_EXIT);
|
| - ZoneList<int> indices(8);
|
| + ZoneList<int> indices(8, isolate->zone());
|
| ASSERT_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag());
|
| String* pattern =
|
| String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex));
|
| @@ -2980,7 +2998,8 @@ MUST_USE_RESULT static MaybeObject* StringReplaceAtomRegExpWithString(
|
| int pattern_len = pattern->length();
|
| int replacement_len = replacement->length();
|
|
|
| - FindStringIndicesDispatch(isolate, *subject, pattern, &indices, 0xffffffff);
|
| + FindStringIndicesDispatch(isolate, *subject, pattern, &indices, 0xffffffff,
|
| + zone);
|
|
|
| int matches = indices.length();
|
| if (matches == 0) return *subject;
|
| @@ -3041,7 +3060,8 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithString(
|
| String* subject,
|
| JSRegExp* regexp,
|
| String* replacement,
|
| - JSArray* last_match_info) {
|
| + JSArray* last_match_info,
|
| + Zone* zone) {
|
| ASSERT(subject->IsFlat());
|
| ASSERT(replacement->IsFlat());
|
|
|
| @@ -3067,8 +3087,8 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithString(
|
| int capture_count = regexp_handle->CaptureCount();
|
|
|
| // CompiledReplacement uses zone allocation.
|
| - ZoneScope zone(isolate, DELETE_ON_EXIT);
|
| - CompiledReplacement compiled_replacement;
|
| + ZoneScope zonescope(isolate, DELETE_ON_EXIT);
|
| + CompiledReplacement compiled_replacement(isolate->zone());
|
| compiled_replacement.Compile(replacement_handle,
|
| capture_count,
|
| length);
|
| @@ -3086,14 +3106,16 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithString(
|
| subject_handle,
|
| regexp_handle,
|
| replacement_handle,
|
| - last_match_info_handle);
|
| + last_match_info_handle,
|
| + zone);
|
| } else {
|
| return StringReplaceAtomRegExpWithString<SeqTwoByteString>(
|
| isolate,
|
| subject_handle,
|
| regexp_handle,
|
| replacement_handle,
|
| - last_match_info_handle);
|
| + last_match_info_handle,
|
| + zone);
|
| }
|
| }
|
|
|
| @@ -3176,7 +3198,8 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithEmptyString(
|
| Isolate* isolate,
|
| String* subject,
|
| JSRegExp* regexp,
|
| - JSArray* last_match_info) {
|
| + JSArray* last_match_info,
|
| + Zone* zone) {
|
| ASSERT(subject->IsFlat());
|
|
|
| HandleScope handles(isolate);
|
| @@ -3195,14 +3218,16 @@ MUST_USE_RESULT static MaybeObject* StringReplaceRegExpWithEmptyString(
|
| subject_handle,
|
| regexp_handle,
|
| empty_string_handle,
|
| - last_match_info_handle);
|
| + last_match_info_handle,
|
| + zone);
|
| } else {
|
| return StringReplaceAtomRegExpWithString<SeqTwoByteString>(
|
| isolate,
|
| subject_handle,
|
| regexp_handle,
|
| empty_string_handle,
|
| - last_match_info_handle);
|
| + last_match_info_handle,
|
| + zone);
|
| }
|
| }
|
|
|
| @@ -3361,13 +3386,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) {
|
|
|
| ASSERT(last_match_info->HasFastObjectElements());
|
|
|
| + Zone* zone = isolate->zone();
|
| if (replacement->length() == 0) {
|
| if (subject->HasOnlyAsciiChars()) {
|
| return StringReplaceRegExpWithEmptyString<SeqAsciiString>(
|
| - isolate, subject, regexp, last_match_info);
|
| + isolate, subject, regexp, last_match_info, zone);
|
| } else {
|
| return StringReplaceRegExpWithEmptyString<SeqTwoByteString>(
|
| - isolate, subject, regexp, last_match_info);
|
| + isolate, subject, regexp, last_match_info, zone);
|
| }
|
| }
|
|
|
| @@ -3375,7 +3401,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) {
|
| subject,
|
| regexp,
|
| replacement,
|
| - last_match_info);
|
| + last_match_info,
|
| + zone);
|
| }
|
|
|
|
|
| @@ -3709,8 +3736,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) {
|
| }
|
| int length = subject->length();
|
|
|
| + Zone* zone = isolate->zone();
|
| ZoneScope zone_space(isolate, DELETE_ON_EXIT);
|
| - ZoneList<int> offsets(8);
|
| + ZoneList<int> offsets(8, zone);
|
| int start;
|
| int end;
|
| do {
|
| @@ -3720,8 +3748,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) {
|
| start = Smi::cast(elements->get(RegExpImpl::kFirstCapture))->value();
|
| end = Smi::cast(elements->get(RegExpImpl::kFirstCapture + 1))->value();
|
| }
|
| - offsets.Add(start);
|
| - offsets.Add(end);
|
| + offsets.Add(start, zone);
|
| + offsets.Add(end, zone);
|
| if (start == end) if (++end > length) break;
|
| match = RegExpImpl::Exec(regexp, subject, end, regexp_info,
|
| isolate->zone());
|
| @@ -6427,17 +6455,18 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) {
|
|
|
| static const int kMaxInitialListCapacity = 16;
|
|
|
| + Zone* zone = isolate->zone();
|
| ZoneScope scope(isolate, DELETE_ON_EXIT);
|
|
|
| // Find (up to limit) indices of separator and end-of-string in subject
|
| int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit);
|
| - ZoneList<int> indices(initial_capacity);
|
| + ZoneList<int> indices(initial_capacity, zone);
|
| if (!pattern->IsFlat()) FlattenString(pattern);
|
|
|
| - FindStringIndicesDispatch(isolate, *subject, *pattern, &indices, limit);
|
| + FindStringIndicesDispatch(isolate, *subject, *pattern, &indices, limit, zone);
|
|
|
| if (static_cast<uint32_t>(indices.length()) < limit) {
|
| - indices.Add(subject_length);
|
| + indices.Add(subject_length, zone);
|
| }
|
|
|
| // The list indices now contains the end of each part to create.
|
| @@ -9276,13 +9305,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) {
|
| ASSERT_EQ(1, args.length());
|
| CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
|
|
|
| + Zone* zone = isolate->zone();
|
| source = Handle<String>(source->TryFlattenGetString());
|
| // Optimized fast case where we only have ASCII characters.
|
| Handle<Object> result;
|
| if (source->IsSeqAsciiString()) {
|
| - result = JsonParser<true>::Parse(source);
|
| + result = JsonParser<true>::Parse(source, zone);
|
| } else {
|
| - result = JsonParser<false>::Parse(source);
|
| + result = JsonParser<false>::Parse(source, zone);
|
| }
|
| if (result.is_null()) {
|
| // Syntax error or stack overflow in scanner.
|
| @@ -12740,7 +12770,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) {
|
| CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0);
|
| CONVERT_BOOLEAN_ARG_CHECKED(do_drop, 1);
|
|
|
| - return *LiveEdit::CheckAndDropActivations(shared_array, do_drop);
|
| + return *LiveEdit::CheckAndDropActivations(shared_array, do_drop,
|
| + isolate->zone());
|
| }
|
|
|
| // Compares 2 strings line-by-line, then token-wise and returns diff in form
|
|
|