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 |