Commit 91397ac7 authored by hpayer's avatar hpayer Committed by Commit bot

[heap] Reland Move large object space selection into AllocateRaw.

BUG=

Review URL: https://codereview.chromium.org/1371033002

Cr-Commit-Position: refs/heads/master@{#30969}
parent 8611fb31
...@@ -123,12 +123,11 @@ AllocationResult Heap::AllocateOneByteInternalizedString( ...@@ -123,12 +123,11 @@ AllocationResult Heap::AllocateOneByteInternalizedString(
// Compute map and object size. // Compute map and object size.
Map* map = one_byte_internalized_string_map(); Map* map = one_byte_internalized_string_map();
int size = SeqOneByteString::SizeFor(str.length()); int size = SeqOneByteString::SizeFor(str.length());
AllocationSpace space = SelectSpace(size, TENURED);
// Allocate string. // Allocate string.
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE);
if (!allocation.To(&result)) return allocation; if (!allocation.To(&result)) return allocation;
} }
...@@ -155,12 +154,11 @@ AllocationResult Heap::AllocateTwoByteInternalizedString(Vector<const uc16> str, ...@@ -155,12 +154,11 @@ AllocationResult Heap::AllocateTwoByteInternalizedString(Vector<const uc16> str,
// Compute map and object size. // Compute map and object size.
Map* map = internalized_string_map(); Map* map = internalized_string_map();
int size = SeqTwoByteString::SizeFor(str.length()); int size = SeqTwoByteString::SizeFor(str.length());
AllocationSpace space = SelectSpace(size, TENURED);
// Allocate string. // Allocate string.
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE);
if (!allocation.To(&result)) return allocation; if (!allocation.To(&result)) return allocation;
} }
...@@ -206,34 +204,47 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationSpace space, ...@@ -206,34 +204,47 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationSpace space,
isolate_->counters()->objs_since_last_young()->Increment(); isolate_->counters()->objs_since_last_young()->Increment();
#endif #endif
bool large_object = size_in_bytes > Page::kMaxRegularHeapObjectSize;
HeapObject* object = nullptr; HeapObject* object = nullptr;
AllocationResult allocation; AllocationResult allocation;
if (NEW_SPACE == space) { if (NEW_SPACE == space) {
allocation = new_space_.AllocateRaw(size_in_bytes, alignment); if (!large_object) {
if (always_allocate() && allocation.IsRetry() && retry_space != NEW_SPACE) { allocation = new_space_.AllocateRaw(size_in_bytes, alignment);
space = retry_space; if (always_allocate() && allocation.IsRetry() &&
} else { retry_space != NEW_SPACE) {
if (allocation.To(&object)) { space = retry_space;
OnAllocationEvent(object, size_in_bytes); } else {
if (allocation.To(&object)) {
OnAllocationEvent(object, size_in_bytes);
}
return allocation;
} }
return allocation; } else {
space = LO_SPACE;
} }
} }
// Here we only allocate in the old generation.
if (OLD_SPACE == space) { if (OLD_SPACE == space) {
allocation = old_space_->AllocateRaw(size_in_bytes, alignment); if (large_object) {
allocation = lo_space_->AllocateRaw(size_in_bytes, NOT_EXECUTABLE);
} else {
allocation = old_space_->AllocateRaw(size_in_bytes, alignment);
}
} else if (CODE_SPACE == space) { } else if (CODE_SPACE == space) {
if (size_in_bytes <= code_space()->AreaSize()) { if (size_in_bytes <= code_space()->AreaSize()) {
allocation = code_space_->AllocateRawUnaligned(size_in_bytes); allocation = code_space_->AllocateRawUnaligned(size_in_bytes);
} else { } else {
// Large code objects are allocated in large object space.
allocation = lo_space_->AllocateRaw(size_in_bytes, EXECUTABLE); allocation = lo_space_->AllocateRaw(size_in_bytes, EXECUTABLE);
} }
} else if (LO_SPACE == space) { } else if (LO_SPACE == space) {
DCHECK(large_object);
allocation = lo_space_->AllocateRaw(size_in_bytes, NOT_EXECUTABLE); allocation = lo_space_->AllocateRaw(size_in_bytes, NOT_EXECUTABLE);
} else { } else if (MAP_SPACE == space) {
DCHECK(MAP_SPACE == space);
allocation = map_space_->AllocateRawUnaligned(size_in_bytes); allocation = map_space_->AllocateRawUnaligned(size_in_bytes);
} else {
// NEW_SPACE is not allowed here.
UNREACHABLE();
} }
if (allocation.To(&object)) { if (allocation.To(&object)) {
OnAllocationEvent(object, size_in_bytes); OnAllocationEvent(object, size_in_bytes);
......
...@@ -2373,7 +2373,7 @@ AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode, ...@@ -2373,7 +2373,7 @@ AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode,
int size = HeapNumber::kSize; int size = HeapNumber::kSize;
STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize);
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
...@@ -2394,7 +2394,7 @@ AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode, ...@@ -2394,7 +2394,7 @@ AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode,
int size = Type::kSize; \ int size = Type::kSize; \
STATIC_ASSERT(Type::kSize <= Page::kMaxRegularHeapObjectSize); \ STATIC_ASSERT(Type::kSize <= Page::kMaxRegularHeapObjectSize); \
\ \
AllocationSpace space = SelectSpace(size, pretenure); \ AllocationSpace space = SelectSpace(pretenure); \
\ \
HeapObject* result = nullptr; \ HeapObject* result = nullptr; \
{ \ { \
...@@ -2934,7 +2934,7 @@ AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) { ...@@ -2934,7 +2934,7 @@ AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) {
v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true);
} }
int size = ByteArray::SizeFor(length); int size = ByteArray::SizeFor(length);
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
...@@ -3145,7 +3145,7 @@ AllocationResult Heap::AllocateFixedTypedArrayWithExternalPointer( ...@@ -3145,7 +3145,7 @@ AllocationResult Heap::AllocateFixedTypedArrayWithExternalPointer(
int length, ExternalArrayType array_type, void* external_pointer, int length, ExternalArrayType array_type, void* external_pointer,
PretenureFlag pretenure) { PretenureFlag pretenure) {
int size = FixedTypedArrayBase::kHeaderSize; int size = FixedTypedArrayBase::kHeaderSize;
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
...@@ -3189,7 +3189,7 @@ AllocationResult Heap::AllocateFixedTypedArray(int length, ...@@ -3189,7 +3189,7 @@ AllocationResult Heap::AllocateFixedTypedArray(int length,
ForFixedTypedArray(array_type, &element_size, &elements_kind); ForFixedTypedArray(array_type, &element_size, &elements_kind);
int size = OBJECT_POINTER_ALIGN(length * element_size + int size = OBJECT_POINTER_ALIGN(length * element_size +
FixedTypedArrayBase::kDataOffset); FixedTypedArrayBase::kDataOffset);
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
HeapObject* object = nullptr; HeapObject* object = nullptr;
AllocationResult allocation = AllocateRaw( AllocationResult allocation = AllocateRaw(
...@@ -3404,8 +3404,7 @@ AllocationResult Heap::AllocateJSObjectFromMap( ...@@ -3404,8 +3404,7 @@ AllocationResult Heap::AllocateJSObjectFromMap(
FixedArray* properties = empty_fixed_array(); FixedArray* properties = empty_fixed_array();
// Allocate the JSObject. // Allocate the JSObject.
int size = map->instance_size(); AllocationSpace space = SelectSpace(pretenure);
AllocationSpace space = SelectSpace(size, pretenure);
JSObject* js_obj = nullptr; JSObject* js_obj = nullptr;
AllocationResult allocation = Allocate(map, space, allocation_site); AllocationResult allocation = Allocate(map, space, allocation_site);
if (!allocation.To(&js_obj)) return allocation; if (!allocation.To(&js_obj)) return allocation;
...@@ -3606,12 +3605,11 @@ AllocationResult Heap::AllocateInternalizedStringImpl(T t, int chars, ...@@ -3606,12 +3605,11 @@ AllocationResult Heap::AllocateInternalizedStringImpl(T t, int chars,
map = internalized_string_map(); map = internalized_string_map();
size = SeqTwoByteString::SizeFor(chars); size = SeqTwoByteString::SizeFor(chars);
} }
AllocationSpace space = SelectSpace(size, TENURED);
// Allocate string. // Allocate string.
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE);
if (!allocation.To(&result)) return allocation; if (!allocation.To(&result)) return allocation;
} }
...@@ -3649,7 +3647,7 @@ AllocationResult Heap::AllocateRawOneByteString(int length, ...@@ -3649,7 +3647,7 @@ AllocationResult Heap::AllocateRawOneByteString(int length,
DCHECK_GE(String::kMaxLength, length); DCHECK_GE(String::kMaxLength, length);
int size = SeqOneByteString::SizeFor(length); int size = SeqOneByteString::SizeFor(length);
DCHECK(size <= SeqOneByteString::kMaxSize); DCHECK(size <= SeqOneByteString::kMaxSize);
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
...@@ -3673,7 +3671,7 @@ AllocationResult Heap::AllocateRawTwoByteString(int length, ...@@ -3673,7 +3671,7 @@ AllocationResult Heap::AllocateRawTwoByteString(int length,
DCHECK_GE(String::kMaxLength, length); DCHECK_GE(String::kMaxLength, length);
int size = SeqTwoByteString::SizeFor(length); int size = SeqTwoByteString::SizeFor(length);
DCHECK(size <= SeqTwoByteString::kMaxSize); DCHECK(size <= SeqTwoByteString::kMaxSize);
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
HeapObject* result = nullptr; HeapObject* result = nullptr;
{ {
...@@ -3808,7 +3806,7 @@ AllocationResult Heap::AllocateRawFixedArray(int length, ...@@ -3808,7 +3806,7 @@ AllocationResult Heap::AllocateRawFixedArray(int length,
v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true);
} }
int size = FixedArray::SizeFor(length); int size = FixedArray::SizeFor(length);
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
return AllocateRaw(size, space, OLD_SPACE); return AllocateRaw(size, space, OLD_SPACE);
} }
...@@ -3877,7 +3875,7 @@ AllocationResult Heap::AllocateRawFixedDoubleArray(int length, ...@@ -3877,7 +3875,7 @@ AllocationResult Heap::AllocateRawFixedDoubleArray(int length,
kDoubleAligned); kDoubleAligned);
} }
int size = FixedDoubleArray::SizeFor(length); int size = FixedDoubleArray::SizeFor(length);
AllocationSpace space = SelectSpace(size, pretenure); AllocationSpace space = SelectSpace(pretenure);
HeapObject* object = nullptr; HeapObject* object = nullptr;
{ {
...@@ -3934,10 +3932,9 @@ AllocationResult Heap::AllocateStruct(InstanceType type) { ...@@ -3934,10 +3932,9 @@ AllocationResult Heap::AllocateStruct(InstanceType type) {
return exception(); return exception();
} }
int size = map->instance_size(); int size = map->instance_size();
AllocationSpace space = SelectSpace(size, TENURED);
Struct* result = nullptr; Struct* result = nullptr;
{ {
AllocationResult allocation = Allocate(map, space); AllocationResult allocation = Allocate(map, OLD_SPACE);
if (!allocation.To(&result)) return allocation; if (!allocation.To(&result)) return allocation;
} }
result->InitializeBody(size); result->InitializeBody(size);
......
...@@ -1646,10 +1646,8 @@ class Heap { ...@@ -1646,10 +1646,8 @@ class Heap {
static void ScavengeStoreBufferCallback(Heap* heap, MemoryChunk* page, static void ScavengeStoreBufferCallback(Heap* heap, MemoryChunk* page,
StoreBufferEvent event); StoreBufferEvent event);
// Selects the proper allocation space depending on the given object // Selects the proper allocation space based on the pretenuring decision.
// size and pretenuring decision. static AllocationSpace SelectSpace(PretenureFlag pretenure) {
static AllocationSpace SelectSpace(int object_size, PretenureFlag pretenure) {
if (object_size > Page::kMaxRegularHeapObjectSize) return LO_SPACE;
return (pretenure == TENURED) ? OLD_SPACE : NEW_SPACE; return (pretenure == TENURED) ? OLD_SPACE : NEW_SPACE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment