Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/runtime.cc

Issue 18635003: Reintroduce runtime zone to Isolate. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/isolate.cc ('k') | src/zone.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3580 matching lines...) Expand 10 before | Expand all | Expand 10 after
3591 template<typename ResultSeqString> 3591 template<typename ResultSeqString>
3592 MUST_USE_RESULT static MaybeObject* StringReplaceGlobalAtomRegExpWithString( 3592 MUST_USE_RESULT static MaybeObject* StringReplaceGlobalAtomRegExpWithString(
3593 Isolate* isolate, 3593 Isolate* isolate,
3594 Handle<String> subject, 3594 Handle<String> subject,
3595 Handle<JSRegExp> pattern_regexp, 3595 Handle<JSRegExp> pattern_regexp,
3596 Handle<String> replacement, 3596 Handle<String> replacement,
3597 Handle<JSArray> last_match_info) { 3597 Handle<JSArray> last_match_info) {
3598 ASSERT(subject->IsFlat()); 3598 ASSERT(subject->IsFlat());
3599 ASSERT(replacement->IsFlat()); 3599 ASSERT(replacement->IsFlat());
3600 3600
3601 Zone zone(isolate); 3601 ZoneScope zone_scope(isolate->runtime_zone());
3602 ZoneList<int> indices(8, &zone); 3602 ZoneList<int> indices(8, zone_scope.zone());
3603 ASSERT_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag()); 3603 ASSERT_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag());
3604 String* pattern = 3604 String* pattern =
3605 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex)); 3605 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex));
3606 int subject_len = subject->length(); 3606 int subject_len = subject->length();
3607 int pattern_len = pattern->length(); 3607 int pattern_len = pattern->length();
3608 int replacement_len = replacement->length(); 3608 int replacement_len = replacement->length();
3609 3609
3610 FindStringIndicesDispatch( 3610 FindStringIndicesDispatch(
3611 isolate, *subject, pattern, &indices, 0xffffffff, &zone); 3611 isolate, *subject, pattern, &indices, 0xffffffff, zone_scope.zone());
3612 3612
3613 int matches = indices.length(); 3613 int matches = indices.length();
3614 if (matches == 0) return *subject; 3614 if (matches == 0) return *subject;
3615 3615
3616 // Detect integer overflow. 3616 // Detect integer overflow.
3617 int64_t result_len_64 = 3617 int64_t result_len_64 =
3618 (static_cast<int64_t>(replacement_len) - 3618 (static_cast<int64_t>(replacement_len) -
3619 static_cast<int64_t>(pattern_len)) * 3619 static_cast<int64_t>(pattern_len)) *
3620 static_cast<int64_t>(matches) + 3620 static_cast<int64_t>(matches) +
3621 static_cast<int64_t>(subject_len); 3621 static_cast<int64_t>(subject_len);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3677 Handle<JSRegExp> regexp, 3677 Handle<JSRegExp> regexp,
3678 Handle<String> replacement, 3678 Handle<String> replacement,
3679 Handle<JSArray> last_match_info) { 3679 Handle<JSArray> last_match_info) {
3680 ASSERT(subject->IsFlat()); 3680 ASSERT(subject->IsFlat());
3681 ASSERT(replacement->IsFlat()); 3681 ASSERT(replacement->IsFlat());
3682 3682
3683 int capture_count = regexp->CaptureCount(); 3683 int capture_count = regexp->CaptureCount();
3684 int subject_length = subject->length(); 3684 int subject_length = subject->length();
3685 3685
3686 // CompiledReplacement uses zone allocation. 3686 // CompiledReplacement uses zone allocation.
3687 Zone zone(isolate); 3687 ZoneScope zone_scope(isolate->runtime_zone());
3688 CompiledReplacement compiled_replacement(&zone); 3688 CompiledReplacement compiled_replacement(zone_scope.zone());
3689 bool simple_replace = compiled_replacement.Compile(replacement, 3689 bool simple_replace = compiled_replacement.Compile(replacement,
3690 capture_count, 3690 capture_count,
3691 subject_length); 3691 subject_length);
3692 3692
3693 // Shortcut for simple non-regexp global replacements 3693 // Shortcut for simple non-regexp global replacements
3694 if (regexp->TypeTag() == JSRegExp::ATOM && simple_replace) { 3694 if (regexp->TypeTag() == JSRegExp::ATOM && simple_replace) {
3695 if (subject->HasOnlyOneByteChars() && 3695 if (subject->HasOnlyOneByteChars() &&
3696 replacement->HasOnlyOneByteChars()) { 3696 replacement->HasOnlyOneByteChars()) {
3697 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>( 3697 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>(
3698 isolate, subject, regexp, replacement, last_match_info); 3698 isolate, subject, regexp, replacement, last_match_info);
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
4211 4211
4212 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 4212 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
4213 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); 4213 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1);
4214 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2); 4214 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2);
4215 4215
4216 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); 4216 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate);
4217 if (global_cache.HasException()) return Failure::Exception(); 4217 if (global_cache.HasException()) return Failure::Exception();
4218 4218
4219 int capture_count = regexp->CaptureCount(); 4219 int capture_count = regexp->CaptureCount();
4220 4220
4221 Zone zone(isolate); 4221 ZoneScope zone_scope(isolate->runtime_zone());
4222 ZoneList<int> offsets(8, &zone); 4222 ZoneList<int> offsets(8, zone_scope.zone());
4223 4223
4224 while (true) { 4224 while (true) {
4225 int32_t* match = global_cache.FetchNext(); 4225 int32_t* match = global_cache.FetchNext();
4226 if (match == NULL) break; 4226 if (match == NULL) break;
4227 offsets.Add(match[0], &zone); // start 4227 offsets.Add(match[0], zone_scope.zone()); // start
4228 offsets.Add(match[1], &zone); // end 4228 offsets.Add(match[1], zone_scope.zone()); // end
4229 } 4229 }
4230 4230
4231 if (global_cache.HasException()) return Failure::Exception(); 4231 if (global_cache.HasException()) return Failure::Exception();
4232 4232
4233 if (offsets.length() == 0) { 4233 if (offsets.length() == 0) {
4234 // Not a single match. 4234 // Not a single match.
4235 return isolate->heap()->null_value(); 4235 return isolate->heap()->null_value();
4236 } 4236 }
4237 4237
4238 RegExpImpl::SetLastMatchInfo(regexp_info, 4238 RegExpImpl::SetLastMatchInfo(regexp_info,
(...skipping 2064 matching lines...) Expand 10 before | Expand all | Expand 10 after
6303 } 6303 }
6304 6304
6305 // The limit can be very large (0xffffffffu), but since the pattern 6305 // The limit can be very large (0xffffffffu), but since the pattern
6306 // isn't empty, we can never create more parts than ~half the length 6306 // isn't empty, we can never create more parts than ~half the length
6307 // of the subject. 6307 // of the subject.
6308 6308
6309 if (!subject->IsFlat()) FlattenString(subject); 6309 if (!subject->IsFlat()) FlattenString(subject);
6310 6310
6311 static const int kMaxInitialListCapacity = 16; 6311 static const int kMaxInitialListCapacity = 16;
6312 6312
6313 Zone zone(isolate); 6313 ZoneScope zone_scope(isolate->runtime_zone());
6314 6314
6315 // Find (up to limit) indices of separator and end-of-string in subject 6315 // Find (up to limit) indices of separator and end-of-string in subject
6316 int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit); 6316 int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit);
6317 ZoneList<int> indices(initial_capacity, &zone); 6317 ZoneList<int> indices(initial_capacity, zone_scope.zone());
6318 if (!pattern->IsFlat()) FlattenString(pattern); 6318 if (!pattern->IsFlat()) FlattenString(pattern);
6319 6319
6320 FindStringIndicesDispatch(isolate, *subject, *pattern, 6320 FindStringIndicesDispatch(isolate, *subject, *pattern,
6321 &indices, limit, &zone); 6321 &indices, limit, zone_scope.zone());
6322 6322
6323 if (static_cast<uint32_t>(indices.length()) < limit) { 6323 if (static_cast<uint32_t>(indices.length()) < limit) {
6324 indices.Add(subject_length, &zone); 6324 indices.Add(subject_length, zone_scope.zone());
6325 } 6325 }
6326 6326
6327 // The list indices now contains the end of each part to create. 6327 // The list indices now contains the end of each part to create.
6328 6328
6329 // Create JSArray of substrings separated by separator. 6329 // Create JSArray of substrings separated by separator.
6330 int part_count = indices.length(); 6330 int part_count = indices.length();
6331 6331
6332 Handle<JSArray> result = isolate->factory()->NewJSArray(part_count); 6332 Handle<JSArray> result = isolate->factory()->NewJSArray(part_count);
6333 MaybeObject* maybe_result = result->EnsureCanContainHeapObjectElements(); 6333 MaybeObject* maybe_result = result->EnsureCanContainHeapObjectElements();
6334 if (maybe_result->IsFailure()) return maybe_result; 6334 if (maybe_result->IsFailure()) return maybe_result;
(...skipping 7610 matching lines...) Expand 10 before | Expand all | Expand 10 after
13945 // Handle last resort GC and make sure to allow future allocations 13945 // Handle last resort GC and make sure to allow future allocations
13946 // to grow the heap without causing GCs (if possible). 13946 // to grow the heap without causing GCs (if possible).
13947 isolate->counters()->gc_last_resort_from_js()->Increment(); 13947 isolate->counters()->gc_last_resort_from_js()->Increment();
13948 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 13948 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
13949 "Runtime::PerformGC"); 13949 "Runtime::PerformGC");
13950 } 13950 }
13951 } 13951 }
13952 13952
13953 13953
13954 } } // namespace v8::internal 13954 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/isolate.cc ('k') | src/zone.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698