| Index: src/runtime.cc
 | 
| diff --git a/src/runtime.cc b/src/runtime.cc
 | 
| index a4187970c7dc4011f27cb315e2372962b0962c52..6dff6a4368d0bbe1e40b1e6a5032d96f103ac5bf 100644
 | 
| --- a/src/runtime.cc
 | 
| +++ b/src/runtime.cc
 | 
| @@ -2526,8 +2526,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,
 | 
| @@ -2547,6 +2549,8 @@ class CompiledReplacement {
 | 
|      return simple_hint_;
 | 
|    }
 | 
|  
 | 
| +  Zone* zone() const { return zone_; }
 | 
| +
 | 
|   private:
 | 
|    enum PartType {
 | 
|      SUBJECT_PREFIX = 1,
 | 
| @@ -2608,7 +2612,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++) {
 | 
| @@ -2623,7 +2628,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 "$".
 | 
| @@ -2633,25 +2639,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;
 | 
| @@ -2684,10 +2690,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;
 | 
| @@ -2701,10 +2707,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;
 | 
| @@ -2713,6 +2719,7 @@ class CompiledReplacement {
 | 
|    ZoneList<ReplacementPart> parts_;
 | 
|    ZoneList<Handle<String> > replacement_substrings_;
 | 
|    bool simple_hint_;
 | 
| +  Zone* zone_;
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -2727,13 +2734,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();
 | 
| @@ -2745,12 +2754,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++;
 | 
|      }
 | 
| @@ -2799,7 +2808,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.
 | 
| @@ -2810,7 +2820,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--;
 | 
|    }
 | 
| @@ -2822,7 +2832,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.
 | 
| @@ -2832,7 +2843,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--;
 | 
|    }
 | 
| @@ -2843,7 +2854,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();
 | 
| @@ -2858,20 +2870,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();
 | 
| @@ -2880,13 +2895,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);
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| @@ -2965,12 +2982,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));
 | 
| @@ -2978,7 +2996,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;
 | 
| @@ -3047,7 +3066,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());
 | 
|  
 | 
| @@ -3073,8 +3093,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);
 | 
| @@ -3092,14 +3112,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);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -3182,7 +3204,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);
 | 
| @@ -3201,14 +3224,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);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -3367,13 +3392,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);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -3381,7 +3407,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) {
 | 
|                                         subject,
 | 
|                                         regexp,
 | 
|                                         replacement,
 | 
| -                                       last_match_info);
 | 
| +                                       last_match_info,
 | 
| +                                       zone);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -3715,8 +3742,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 {
 | 
| @@ -3726,8 +3754,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());
 | 
| @@ -6433,17 +6461,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.
 | 
| @@ -9282,13 +9311,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.
 | 
| @@ -12744,7 +12774,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
 | 
| 
 |