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

Side by Side Diff: src/heap/heap.cc

Issue 1373523002: [heap] Move large object space selection into AllocateRaw. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.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 // 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/heap/heap.h" 5 #include "src/heap/heap.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 2346 matching lines...) Expand 10 before | Expand all | Expand 10 after
2357 } 2357 }
2358 2358
2359 2359
2360 AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode, 2360 AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode,
2361 PretenureFlag pretenure) { 2361 PretenureFlag pretenure) {
2362 // Statically ensure that it is safe to allocate heap numbers in paged 2362 // Statically ensure that it is safe to allocate heap numbers in paged
2363 // spaces. 2363 // spaces.
2364 int size = HeapNumber::kSize; 2364 int size = HeapNumber::kSize;
2365 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); 2365 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize);
2366 2366
2367 AllocationSpace space = SelectSpace(size, pretenure); 2367 AllocationSpace space = SelectSpace(pretenure);
2368 2368
2369 HeapObject* result = nullptr; 2369 HeapObject* result = nullptr;
2370 { 2370 {
2371 AllocationResult allocation = 2371 AllocationResult allocation =
2372 AllocateRaw(size, space, OLD_SPACE, kDoubleUnaligned); 2372 AllocateRaw(size, space, OLD_SPACE, kDoubleUnaligned);
2373 if (!allocation.To(&result)) return allocation; 2373 if (!allocation.To(&result)) return allocation;
2374 } 2374 }
2375 2375
2376 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); 2376 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map();
2377 HeapObject::cast(result)->set_map_no_write_barrier(map); 2377 HeapObject::cast(result)->set_map_no_write_barrier(map);
2378 HeapNumber::cast(result)->set_value(value); 2378 HeapNumber::cast(result)->set_value(value);
2379 return result; 2379 return result;
2380 } 2380 }
2381 2381
2382 #define SIMD_ALLOCATE_DEFINITION(TYPE, Type, type, lane_count, lane_type) \ 2382 #define SIMD_ALLOCATE_DEFINITION(TYPE, Type, type, lane_count, lane_type) \
2383 AllocationResult Heap::Allocate##Type(lane_type lanes[lane_count], \ 2383 AllocationResult Heap::Allocate##Type(lane_type lanes[lane_count], \
2384 PretenureFlag pretenure) { \ 2384 PretenureFlag pretenure) { \
2385 int size = Type::kSize; \ 2385 int size = Type::kSize; \
2386 STATIC_ASSERT(Type::kSize <= Page::kMaxRegularHeapObjectSize); \ 2386 STATIC_ASSERT(Type::kSize <= Page::kMaxRegularHeapObjectSize); \
2387 \ 2387 \
2388 AllocationSpace space = SelectSpace(size, pretenure); \ 2388 AllocationSpace space = SelectSpace(pretenure); \
2389 \ 2389 \
2390 HeapObject* result = nullptr; \ 2390 HeapObject* result = nullptr; \
2391 { \ 2391 { \
2392 AllocationResult allocation = \ 2392 AllocationResult allocation = \
2393 AllocateRaw(size, space, OLD_SPACE, kSimd128Unaligned); \ 2393 AllocateRaw(size, space, OLD_SPACE, kSimd128Unaligned); \
2394 if (!allocation.To(&result)) return allocation; \ 2394 if (!allocation.To(&result)) return allocation; \
2395 } \ 2395 } \
2396 \ 2396 \
2397 result->set_map_no_write_barrier(type##_map()); \ 2397 result->set_map_no_write_barrier(type##_map()); \
2398 Type* instance = Type::cast(result); \ 2398 Type* instance = Type::cast(result); \
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after
2916 result->set_foreign_address(address); 2916 result->set_foreign_address(address);
2917 return result; 2917 return result;
2918 } 2918 }
2919 2919
2920 2920
2921 AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) { 2921 AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) {
2922 if (length < 0 || length > ByteArray::kMaxLength) { 2922 if (length < 0 || length > ByteArray::kMaxLength) {
2923 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); 2923 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true);
2924 } 2924 }
2925 int size = ByteArray::SizeFor(length); 2925 int size = ByteArray::SizeFor(length);
2926 AllocationSpace space = SelectSpace(size, pretenure); 2926 AllocationSpace space = SelectSpace(pretenure);
2927 HeapObject* result = nullptr; 2927 HeapObject* result = nullptr;
2928 { 2928 {
2929 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); 2929 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
2930 if (!allocation.To(&result)) return allocation; 2930 if (!allocation.To(&result)) return allocation;
2931 } 2931 }
2932 2932
2933 result->set_map_no_write_barrier(byte_array_map()); 2933 result->set_map_no_write_barrier(byte_array_map());
2934 ByteArray::cast(result)->set_length(length); 2934 ByteArray::cast(result)->set_length(length);
2935 return result; 2935 return result;
2936 } 2936 }
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
3127 if (profiler->is_tracking_allocations()) { 3127 if (profiler->is_tracking_allocations()) {
3128 profiler->UpdateObjectSizeEvent(object->address(), object->Size()); 3128 profiler->UpdateObjectSizeEvent(object->address(), object->Size());
3129 } 3129 }
3130 } 3130 }
3131 3131
3132 3132
3133 AllocationResult Heap::AllocateFixedTypedArrayWithExternalPointer( 3133 AllocationResult Heap::AllocateFixedTypedArrayWithExternalPointer(
3134 int length, ExternalArrayType array_type, void* external_pointer, 3134 int length, ExternalArrayType array_type, void* external_pointer,
3135 PretenureFlag pretenure) { 3135 PretenureFlag pretenure) {
3136 int size = FixedTypedArrayBase::kHeaderSize; 3136 int size = FixedTypedArrayBase::kHeaderSize;
3137 AllocationSpace space = SelectSpace(size, pretenure); 3137 AllocationSpace space = SelectSpace(pretenure);
3138 HeapObject* result = nullptr; 3138 HeapObject* result = nullptr;
3139 { 3139 {
3140 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); 3140 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
3141 if (!allocation.To(&result)) return allocation; 3141 if (!allocation.To(&result)) return allocation;
3142 } 3142 }
3143 3143
3144 result->set_map_no_write_barrier(MapForFixedTypedArray(array_type)); 3144 result->set_map_no_write_barrier(MapForFixedTypedArray(array_type));
3145 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(result); 3145 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(result);
3146 elements->set_base_pointer(Smi::FromInt(0), SKIP_WRITE_BARRIER); 3146 elements->set_base_pointer(Smi::FromInt(0), SKIP_WRITE_BARRIER);
3147 elements->set_external_pointer(external_pointer, SKIP_WRITE_BARRIER); 3147 elements->set_external_pointer(external_pointer, SKIP_WRITE_BARRIER);
(...skipping 23 matching lines...) Expand all
3171 3171
3172 AllocationResult Heap::AllocateFixedTypedArray(int length, 3172 AllocationResult Heap::AllocateFixedTypedArray(int length,
3173 ExternalArrayType array_type, 3173 ExternalArrayType array_type,
3174 bool initialize, 3174 bool initialize,
3175 PretenureFlag pretenure) { 3175 PretenureFlag pretenure) {
3176 int element_size; 3176 int element_size;
3177 ElementsKind elements_kind; 3177 ElementsKind elements_kind;
3178 ForFixedTypedArray(array_type, &element_size, &elements_kind); 3178 ForFixedTypedArray(array_type, &element_size, &elements_kind);
3179 int size = OBJECT_POINTER_ALIGN(length * element_size + 3179 int size = OBJECT_POINTER_ALIGN(length * element_size +
3180 FixedTypedArrayBase::kDataOffset); 3180 FixedTypedArrayBase::kDataOffset);
3181 AllocationSpace space = SelectSpace(size, pretenure); 3181 AllocationSpace space = SelectSpace(pretenure);
3182 3182
3183 HeapObject* object = nullptr; 3183 HeapObject* object = nullptr;
3184 AllocationResult allocation = AllocateRaw( 3184 AllocationResult allocation = AllocateRaw(
3185 size, space, OLD_SPACE, 3185 size, space, OLD_SPACE,
3186 array_type == kExternalFloat64Array ? kDoubleAligned : kWordAligned); 3186 array_type == kExternalFloat64Array ? kDoubleAligned : kWordAligned);
3187 if (!allocation.To(&object)) return allocation; 3187 if (!allocation.To(&object)) return allocation;
3188 3188
3189 object->set_map_no_write_barrier(MapForFixedTypedArray(array_type)); 3189 object->set_map_no_write_barrier(MapForFixedTypedArray(array_type));
3190 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object); 3190 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object);
3191 elements->set_base_pointer(elements, SKIP_WRITE_BARRIER); 3191 elements->set_base_pointer(elements, SKIP_WRITE_BARRIER);
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
3386 3386
3387 // Both types of global objects should be allocated using 3387 // Both types of global objects should be allocated using
3388 // AllocateGlobalObject to be properly initialized. 3388 // AllocateGlobalObject to be properly initialized.
3389 DCHECK(map->instance_type() != JS_GLOBAL_OBJECT_TYPE); 3389 DCHECK(map->instance_type() != JS_GLOBAL_OBJECT_TYPE);
3390 DCHECK(map->instance_type() != JS_BUILTINS_OBJECT_TYPE); 3390 DCHECK(map->instance_type() != JS_BUILTINS_OBJECT_TYPE);
3391 3391
3392 // Allocate the backing storage for the properties. 3392 // Allocate the backing storage for the properties.
3393 FixedArray* properties = empty_fixed_array(); 3393 FixedArray* properties = empty_fixed_array();
3394 3394
3395 // Allocate the JSObject. 3395 // Allocate the JSObject.
3396 int size = map->instance_size(); 3396 AllocationSpace space = SelectSpace(pretenure);
3397 AllocationSpace space = SelectSpace(size, pretenure);
3398 JSObject* js_obj = nullptr; 3397 JSObject* js_obj = nullptr;
3399 AllocationResult allocation = Allocate(map, space, allocation_site); 3398 AllocationResult allocation = Allocate(map, space, allocation_site);
3400 if (!allocation.To(&js_obj)) return allocation; 3399 if (!allocation.To(&js_obj)) return allocation;
3401 3400
3402 // Initialize the JSObject. 3401 // Initialize the JSObject.
3403 InitializeJSObjectFromMap(js_obj, properties, map); 3402 InitializeJSObjectFromMap(js_obj, properties, map);
3404 DCHECK(js_obj->HasFastElements() || js_obj->HasFixedTypedArrayElements()); 3403 DCHECK(js_obj->HasFastElements() || js_obj->HasFixedTypedArrayElements());
3405 return js_obj; 3404 return js_obj;
3406 } 3405 }
3407 3406
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3588 3587
3589 DCHECK_LE(0, chars); 3588 DCHECK_LE(0, chars);
3590 DCHECK_GE(String::kMaxLength, chars); 3589 DCHECK_GE(String::kMaxLength, chars);
3591 if (is_one_byte) { 3590 if (is_one_byte) {
3592 map = one_byte_internalized_string_map(); 3591 map = one_byte_internalized_string_map();
3593 size = SeqOneByteString::SizeFor(chars); 3592 size = SeqOneByteString::SizeFor(chars);
3594 } else { 3593 } else {
3595 map = internalized_string_map(); 3594 map = internalized_string_map();
3596 size = SeqTwoByteString::SizeFor(chars); 3595 size = SeqTwoByteString::SizeFor(chars);
3597 } 3596 }
3598 AllocationSpace space = SelectSpace(size, TENURED);
3599 3597
3600 // Allocate string. 3598 // Allocate string.
3601 HeapObject* result = nullptr; 3599 HeapObject* result = nullptr;
3602 { 3600 {
3603 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); 3601 AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE);
3604 if (!allocation.To(&result)) return allocation; 3602 if (!allocation.To(&result)) return allocation;
3605 } 3603 }
3606 3604
3607 result->set_map_no_write_barrier(map); 3605 result->set_map_no_write_barrier(map);
3608 // Set length and hash fields of the allocated string. 3606 // Set length and hash fields of the allocated string.
3609 String* answer = String::cast(result); 3607 String* answer = String::cast(result);
3610 answer->set_length(chars); 3608 answer->set_length(chars);
3611 answer->set_hash_field(hash_field); 3609 answer->set_hash_field(hash_field);
3612 3610
3613 DCHECK_EQ(size, answer->Size()); 3611 DCHECK_EQ(size, answer->Size());
(...skipping 17 matching lines...) Expand all
3631 template AllocationResult Heap::AllocateInternalizedStringImpl<false>( 3629 template AllocationResult Heap::AllocateInternalizedStringImpl<false>(
3632 Vector<const char>, int, uint32_t); 3630 Vector<const char>, int, uint32_t);
3633 3631
3634 3632
3635 AllocationResult Heap::AllocateRawOneByteString(int length, 3633 AllocationResult Heap::AllocateRawOneByteString(int length,
3636 PretenureFlag pretenure) { 3634 PretenureFlag pretenure) {
3637 DCHECK_LE(0, length); 3635 DCHECK_LE(0, length);
3638 DCHECK_GE(String::kMaxLength, length); 3636 DCHECK_GE(String::kMaxLength, length);
3639 int size = SeqOneByteString::SizeFor(length); 3637 int size = SeqOneByteString::SizeFor(length);
3640 DCHECK(size <= SeqOneByteString::kMaxSize); 3638 DCHECK(size <= SeqOneByteString::kMaxSize);
3641 AllocationSpace space = SelectSpace(size, pretenure); 3639 AllocationSpace space = SelectSpace(pretenure);
3642 3640
3643 HeapObject* result = nullptr; 3641 HeapObject* result = nullptr;
3644 { 3642 {
3645 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); 3643 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
3646 if (!allocation.To(&result)) return allocation; 3644 if (!allocation.To(&result)) return allocation;
3647 } 3645 }
3648 3646
3649 // Partially initialize the object. 3647 // Partially initialize the object.
3650 result->set_map_no_write_barrier(one_byte_string_map()); 3648 result->set_map_no_write_barrier(one_byte_string_map());
3651 String::cast(result)->set_length(length); 3649 String::cast(result)->set_length(length);
3652 String::cast(result)->set_hash_field(String::kEmptyHashField); 3650 String::cast(result)->set_hash_field(String::kEmptyHashField);
3653 DCHECK_EQ(size, HeapObject::cast(result)->Size()); 3651 DCHECK_EQ(size, HeapObject::cast(result)->Size());
3654 3652
3655 return result; 3653 return result;
3656 } 3654 }
3657 3655
3658 3656
3659 AllocationResult Heap::AllocateRawTwoByteString(int length, 3657 AllocationResult Heap::AllocateRawTwoByteString(int length,
3660 PretenureFlag pretenure) { 3658 PretenureFlag pretenure) {
3661 DCHECK_LE(0, length); 3659 DCHECK_LE(0, length);
3662 DCHECK_GE(String::kMaxLength, length); 3660 DCHECK_GE(String::kMaxLength, length);
3663 int size = SeqTwoByteString::SizeFor(length); 3661 int size = SeqTwoByteString::SizeFor(length);
3664 DCHECK(size <= SeqTwoByteString::kMaxSize); 3662 DCHECK(size <= SeqTwoByteString::kMaxSize);
3665 AllocationSpace space = SelectSpace(size, pretenure); 3663 AllocationSpace space = SelectSpace(pretenure);
3666 3664
3667 HeapObject* result = nullptr; 3665 HeapObject* result = nullptr;
3668 { 3666 {
3669 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); 3667 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
3670 if (!allocation.To(&result)) return allocation; 3668 if (!allocation.To(&result)) return allocation;
3671 } 3669 }
3672 3670
3673 // Partially initialize the object. 3671 // Partially initialize the object.
3674 result->set_map_no_write_barrier(string_map()); 3672 result->set_map_no_write_barrier(string_map());
3675 String::cast(result)->set_length(length); 3673 String::cast(result)->set_length(length);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
3790 return obj; 3788 return obj;
3791 } 3789 }
3792 3790
3793 3791
3794 AllocationResult Heap::AllocateRawFixedArray(int length, 3792 AllocationResult Heap::AllocateRawFixedArray(int length,
3795 PretenureFlag pretenure) { 3793 PretenureFlag pretenure) {
3796 if (length < 0 || length > FixedArray::kMaxLength) { 3794 if (length < 0 || length > FixedArray::kMaxLength) {
3797 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); 3795 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true);
3798 } 3796 }
3799 int size = FixedArray::SizeFor(length); 3797 int size = FixedArray::SizeFor(length);
3800 AllocationSpace space = SelectSpace(size, pretenure); 3798 AllocationSpace space = SelectSpace(pretenure);
3801 3799
3802 return AllocateRaw(size, space, OLD_SPACE); 3800 return AllocateRaw(size, space, OLD_SPACE);
3803 } 3801 }
3804 3802
3805 3803
3806 AllocationResult Heap::AllocateFixedArrayWithFiller(int length, 3804 AllocationResult Heap::AllocateFixedArrayWithFiller(int length,
3807 PretenureFlag pretenure, 3805 PretenureFlag pretenure,
3808 Object* filler) { 3806 Object* filler) {
3809 DCHECK(length >= 0); 3807 DCHECK(length >= 0);
3810 DCHECK(empty_fixed_array()->IsFixedArray()); 3808 DCHECK(empty_fixed_array()->IsFixedArray());
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
3859 } 3857 }
3860 3858
3861 3859
3862 AllocationResult Heap::AllocateRawFixedDoubleArray(int length, 3860 AllocationResult Heap::AllocateRawFixedDoubleArray(int length,
3863 PretenureFlag pretenure) { 3861 PretenureFlag pretenure) {
3864 if (length < 0 || length > FixedDoubleArray::kMaxLength) { 3862 if (length < 0 || length > FixedDoubleArray::kMaxLength) {
3865 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", 3863 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length",
3866 kDoubleAligned); 3864 kDoubleAligned);
3867 } 3865 }
3868 int size = FixedDoubleArray::SizeFor(length); 3866 int size = FixedDoubleArray::SizeFor(length);
3869 AllocationSpace space = SelectSpace(size, pretenure); 3867 AllocationSpace space = SelectSpace(pretenure);
3870 3868
3871 HeapObject* object = nullptr; 3869 HeapObject* object = nullptr;
3872 { 3870 {
3873 AllocationResult allocation = 3871 AllocationResult allocation =
3874 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned); 3872 AllocateRaw(size, space, OLD_SPACE, kDoubleAligned);
3875 if (!allocation.To(&object)) return allocation; 3873 if (!allocation.To(&object)) return allocation;
3876 } 3874 }
3877 3875
3878 return object; 3876 return object;
3879 } 3877 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3916 case NAME##_TYPE: \ 3914 case NAME##_TYPE: \
3917 map = name##_map(); \ 3915 map = name##_map(); \
3918 break; 3916 break;
3919 STRUCT_LIST(MAKE_CASE) 3917 STRUCT_LIST(MAKE_CASE)
3920 #undef MAKE_CASE 3918 #undef MAKE_CASE
3921 default: 3919 default:
3922 UNREACHABLE(); 3920 UNREACHABLE();
3923 return exception(); 3921 return exception();
3924 } 3922 }
3925 int size = map->instance_size(); 3923 int size = map->instance_size();
3926 AllocationSpace space = SelectSpace(size, TENURED);
3927 Struct* result = nullptr; 3924 Struct* result = nullptr;
3928 { 3925 {
3929 AllocationResult allocation = Allocate(map, space); 3926 AllocationResult allocation = Allocate(map, OLD_SPACE);
3930 if (!allocation.To(&result)) return allocation; 3927 if (!allocation.To(&result)) return allocation;
3931 } 3928 }
3932 result->InitializeBody(size); 3929 result->InitializeBody(size);
3933 return result; 3930 return result;
3934 } 3931 }
3935 3932
3936 3933
3937 bool Heap::IsHeapIterable() { 3934 bool Heap::IsHeapIterable() {
3938 // TODO(hpayer): This function is not correct. Allocation folding in old 3935 // TODO(hpayer): This function is not correct. Allocation folding in old
3939 // space breaks the iterability. 3936 // space breaks the iterability.
(...skipping 2165 matching lines...) Expand 10 before | Expand all | Expand 10 after
6105 } 6102 }
6106 6103
6107 6104
6108 // static 6105 // static
6109 int Heap::GetStaticVisitorIdForMap(Map* map) { 6106 int Heap::GetStaticVisitorIdForMap(Map* map) {
6110 return StaticVisitorBase::GetVisitorId(map); 6107 return StaticVisitorBase::GetVisitorId(map);
6111 } 6108 }
6112 6109
6113 } // namespace internal 6110 } // namespace internal
6114 } // namespace v8 6111 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698