Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index ca7cea5ac17ec8ae2f3a109ca29e05423a1edb3c..188b246db29b8ed51c3f8aaa695b83af09423f37 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -914,14 +914,14 @@ void Heap::ReserveSpace(int *sizes, Address *locations_out) { |
ASSERT(NEW_SPACE == FIRST_PAGED_SPACE - 1); |
for (int space = NEW_SPACE; space <= LAST_PAGED_SPACE; space++) { |
if (sizes[space] != 0) { |
- MaybeObject* allocation; |
+ AllocationResult allocation; |
if (space == NEW_SPACE) { |
allocation = new_space()->AllocateRaw(sizes[space]); |
} else { |
allocation = paged_space(space)->AllocateRaw(sizes[space]); |
} |
FreeListNode* node; |
- if (!allocation->To<FreeListNode>(&node)) { |
+ if (!allocation.To(&node)) { |
if (space == NEW_SPACE) { |
Heap::CollectGarbage(NEW_SPACE, |
"failed to reserve space in the new space"); |
@@ -2045,20 +2045,18 @@ class ScavengingVisitor : public StaticVisitorBase { |
Heap* heap = map->GetHeap(); |
if (heap->ShouldBePromoted(object->address(), object_size)) { |
- MaybeObject* maybe_result; |
+ AllocationResult allocation; |
if (object_contents == DATA_OBJECT) { |
ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE)); |
- maybe_result = heap->old_data_space()->AllocateRaw(allocation_size); |
+ allocation = heap->old_data_space()->AllocateRaw(allocation_size); |
} else { |
ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE)); |
- maybe_result = heap->old_pointer_space()->AllocateRaw(allocation_size); |
+ allocation = heap->old_pointer_space()->AllocateRaw(allocation_size); |
} |
- Object* result = NULL; // Initialization to please compiler. |
- if (maybe_result->ToObject(&result)) { |
- HeapObject* target = HeapObject::cast(result); |
- |
+ HeapObject* target = NULL; // Initialization to please compiler. |
+ if (allocation.To(&target)) { |
if (alignment != kObjectAlignment) { |
target = EnsureDoubleAligned(heap, target, allocation_size); |
} |
@@ -2083,10 +2081,10 @@ class ScavengingVisitor : public StaticVisitorBase { |
} |
} |
ASSERT(heap->AllowedToBeMigrated(object, NEW_SPACE)); |
- MaybeObject* allocation = heap->new_space()->AllocateRaw(allocation_size); |
+ AllocationResult allocation = |
+ heap->new_space()->AllocateRaw(allocation_size); |
heap->promotion_queue()->SetNewLimit(heap->new_space()->top()); |
- Object* result = allocation->ToObjectUnchecked(); |
- HeapObject* target = HeapObject::cast(result); |
+ HeapObject* target = HeapObject::cast(allocation.ToObjectChecked()); |
if (alignment != kObjectAlignment) { |
target = EnsureDoubleAligned(heap, target, allocation_size); |
@@ -2323,11 +2321,11 @@ void Heap::ScavengeObjectSlow(HeapObject** p, HeapObject* object) { |
} |
-MaybeObject* Heap::AllocatePartialMap(InstanceType instance_type, |
- int instance_size) { |
+AllocationResult Heap::AllocatePartialMap(InstanceType instance_type, |
+ int instance_size) { |
Object* result; |
- MaybeObject* maybe_result = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ AllocationResult allocation = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
// Map::cast cannot be used due to uninitialized map field. |
reinterpret_cast<Map*>(result)->set_map(raw_unchecked_meta_map()); |
@@ -2347,15 +2345,15 @@ MaybeObject* Heap::AllocatePartialMap(InstanceType instance_type, |
} |
-MaybeObject* Heap::AllocateMap(InstanceType instance_type, |
- int instance_size, |
- ElementsKind elements_kind) { |
- Object* result; |
- MaybeObject* maybe_result = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); |
- if (!maybe_result->To(&result)) return maybe_result; |
+AllocationResult Heap::AllocateMap(InstanceType instance_type, |
+ int instance_size, |
+ ElementsKind elements_kind) { |
+ HeapObject* result; |
+ AllocationResult allocation = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
- Map* map = reinterpret_cast<Map*>(result); |
- map->set_map_no_write_barrier(meta_map()); |
+ result->set_map_no_write_barrier(meta_map()); |
+ Map* map = Map::cast(result); |
map->set_instance_type(instance_type); |
map->set_visitor_id( |
StaticVisitorBase::GetVisitorId(instance_type, instance_size)); |
@@ -2381,19 +2379,19 @@ MaybeObject* Heap::AllocateMap(InstanceType instance_type, |
} |
-MaybeObject* Heap::AllocateFillerObject(int size, |
- bool double_align, |
- AllocationSpace space) { |
- HeapObject* allocation; |
- { MaybeObject* maybe_allocation = AllocateRaw(size, space, space); |
- if (!maybe_allocation->To(&allocation)) return maybe_allocation; |
+AllocationResult Heap::AllocateFillerObject(int size, |
+ bool double_align, |
+ AllocationSpace space) { |
+ HeapObject* obj; |
+ { AllocationResult allocation = AllocateRaw(size, space, space); |
+ if (!allocation.To(&obj)) return allocation; |
} |
#ifdef DEBUG |
- MemoryChunk* chunk = MemoryChunk::FromAddress(allocation->address()); |
+ MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); |
ASSERT(chunk->owner()->identity() == space); |
#endif |
- CreateFillerObjectAt(allocation->address(), size); |
- return allocation; |
+ CreateFillerObjectAt(obj->address(), size); |
+ return obj; |
} |
@@ -2422,9 +2420,9 @@ const Heap::StructTable Heap::struct_table[] = { |
bool Heap::CreateInitialMaps() { |
- Object* obj; |
- { MaybeObject* maybe_obj = AllocatePartialMap(MAP_TYPE, Map::kSize); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ HeapObject* obj; |
+ { AllocationResult allocation = AllocatePartialMap(MAP_TYPE, Map::kSize); |
+ if (!allocation.To(&obj)) return false; |
} |
// Map::cast cannot be used due to uninitialized map field. |
Map* new_meta_map = reinterpret_cast<Map*>(obj); |
@@ -2434,7 +2432,7 @@ bool Heap::CreateInitialMaps() { |
{ // Partial map allocation |
#define ALLOCATE_PARTIAL_MAP(instance_type, size, field_name) \ |
{ Map* map; \ |
- if (!AllocatePartialMap((instance_type), (size))->To(&map)) return false;\ |
+ if (!AllocatePartialMap((instance_type), (size)).To(&map)) return false; \ |
set_##field_name##_map(map); \ |
} |
@@ -2448,19 +2446,19 @@ bool Heap::CreateInitialMaps() { |
} |
// Allocate the empty array. |
- { MaybeObject* maybe_obj = AllocateEmptyFixedArray(); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ { AllocationResult allocation = AllocateEmptyFixedArray(); |
+ if (!allocation.To(&obj)) return false; |
} |
set_empty_fixed_array(FixedArray::cast(obj)); |
- { MaybeObject* maybe_obj = Allocate(null_map(), OLD_POINTER_SPACE); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ { AllocationResult allocation = Allocate(null_map(), OLD_POINTER_SPACE); |
+ if (!allocation.To(&obj)) return false; |
} |
set_null_value(Oddball::cast(obj)); |
Oddball::cast(obj)->set_kind(Oddball::kNull); |
- { MaybeObject* maybe_obj = Allocate(undefined_map(), OLD_POINTER_SPACE); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ { AllocationResult allocation = Allocate(undefined_map(), OLD_POINTER_SPACE); |
+ if (!allocation.To(&obj)) return false; |
} |
set_undefined_value(Oddball::cast(obj)); |
Oddball::cast(obj)->set_kind(Oddball::kUndefined); |
@@ -2470,14 +2468,14 @@ bool Heap::CreateInitialMaps() { |
set_exception(null_value()); |
// Allocate the empty descriptor array. |
- { MaybeObject* maybe_obj = AllocateEmptyFixedArray(); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ { AllocationResult allocation = AllocateEmptyFixedArray(); |
+ if (!allocation.To(&obj)) return false; |
} |
set_empty_descriptor_array(DescriptorArray::cast(obj)); |
// Allocate the constant pool array. |
- { MaybeObject* maybe_obj = AllocateEmptyConstantPoolArray(); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ { AllocationResult allocation = AllocateEmptyConstantPoolArray(); |
+ if (!allocation.To(&obj)) return false; |
} |
set_empty_constant_pool_array(ConstantPoolArray::cast(obj)); |
@@ -2528,7 +2526,7 @@ bool Heap::CreateInitialMaps() { |
{ // Map allocation |
#define ALLOCATE_MAP(instance_type, size, field_name) \ |
{ Map* map; \ |
- if (!AllocateMap((instance_type), size)->To(&map)) return false; \ |
+ if (!AllocateMap((instance_type), size).To(&map)) return false; \ |
set_##field_name##_map(map); \ |
} |
@@ -2553,8 +2551,8 @@ bool Heap::CreateInitialMaps() { |
for (unsigned i = 0; i < ARRAY_SIZE(string_type_table); i++) { |
const StringTypeTable& entry = string_type_table[i]; |
- { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); |
- if (!maybe_obj->ToObject(&obj)) return false; |
+ { AllocationResult allocation = AllocateMap(entry.type, entry.size); |
+ if (!allocation.To(&obj)) return false; |
} |
// Mark cons string maps as unstable, because their objects can change |
// maps during GC. |
@@ -2600,7 +2598,7 @@ bool Heap::CreateInitialMaps() { |
for (unsigned i = 0; i < ARRAY_SIZE(struct_table); i++) { |
const StructTable& entry = struct_table[i]; |
Map* map; |
- if (!AllocateMap(entry.type, entry.size)->To(&map)) |
+ if (!AllocateMap(entry.type, entry.size).To(&map)) |
return false; |
roots_[entry.index] = map; |
} |
@@ -2634,13 +2632,13 @@ bool Heap::CreateInitialMaps() { |
{ // Empty arrays |
{ ByteArray* byte_array; |
- if (!AllocateByteArray(0, TENURED)->To(&byte_array)) return false; |
+ if (!AllocateByteArray(0, TENURED).To(&byte_array)) return false; |
set_empty_byte_array(byte_array); |
} |
#define ALLOCATE_EMPTY_EXTERNAL_ARRAY(Type, type, TYPE, ctype, size) \ |
{ ExternalArray* obj; \ |
- if (!AllocateEmptyExternalArray(kExternal##Type##Array)->To(&obj)) \ |
+ if (!AllocateEmptyExternalArray(kExternal##Type##Array).To(&obj)) \ |
return false; \ |
set_empty_external_##type##_array(obj); \ |
} |
@@ -2650,7 +2648,7 @@ bool Heap::CreateInitialMaps() { |
#define ALLOCATE_EMPTY_FIXED_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ |
{ FixedTypedArrayBase* obj; \ |
- if (!AllocateEmptyFixedTypedArray(kExternal##Type##Array)->To(&obj)) \ |
+ if (!AllocateEmptyFixedTypedArray(kExternal##Type##Array).To(&obj)) \ |
return false; \ |
set_empty_fixed_##type##_array(obj); \ |
} |
@@ -2663,7 +2661,8 @@ bool Heap::CreateInitialMaps() { |
} |
-MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateHeapNumber(double value, |
+ PretenureFlag pretenure) { |
// Statically ensure that it is safe to allocate heap numbers in paged |
// spaces. |
int size = HeapNumber::kSize; |
@@ -2671,42 +2670,41 @@ MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
} |
- HeapObject::cast(result)->set_map_no_write_barrier(heap_number_map()); |
+ result->set_map_no_write_barrier(heap_number_map()); |
HeapNumber::cast(result)->set_value(value); |
return result; |
} |
-MaybeObject* Heap::AllocateCell(Object* value) { |
+AllocationResult Heap::AllocateCell(Object* value) { |
int size = Cell::kSize; |
STATIC_ASSERT(Cell::kSize <= Page::kMaxRegularHeapObjectSize); |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRaw(size, CELL_SPACE, CELL_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRaw(size, CELL_SPACE, CELL_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
} |
- HeapObject::cast(result)->set_map_no_write_barrier(cell_map()); |
+ result->set_map_no_write_barrier(cell_map()); |
Cell::cast(result)->set_value(value); |
return result; |
} |
-MaybeObject* Heap::AllocatePropertyCell() { |
+AllocationResult Heap::AllocatePropertyCell() { |
int size = PropertyCell::kSize; |
STATIC_ASSERT(PropertyCell::kSize <= Page::kMaxRegularHeapObjectSize); |
- Object* result; |
- MaybeObject* maybe_result = |
+ HeapObject* result; |
+ AllocationResult allocation = |
AllocateRaw(size, PROPERTY_CELL_SPACE, PROPERTY_CELL_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ if (!allocation.To(&result)) return allocation; |
- HeapObject::cast(result)->set_map_no_write_barrier( |
- global_property_cell_map()); |
+ result->set_map_no_write_barrier(global_property_cell_map()); |
PropertyCell* cell = PropertyCell::cast(result); |
cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), |
SKIP_WRITE_BARRIER); |
@@ -3240,32 +3238,32 @@ FixedTypedArrayBase* Heap::EmptyFixedTypedArrayForMap(Map* map) { |
} |
-MaybeObject* Heap::AllocateForeign(Address address, PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateForeign(Address address, |
+ PretenureFlag pretenure) { |
// Statically ensure that it is safe to allocate foreigns in paged spaces. |
STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); |
AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
Foreign* result; |
- MaybeObject* maybe_result = Allocate(foreign_map(), space); |
- if (!maybe_result->To(&result)) return maybe_result; |
+ AllocationResult allocation = Allocate(foreign_map(), space); |
+ if (!allocation.To(&result)) return allocation; |
result->set_foreign_address(address); |
return result; |
} |
-MaybeObject* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
if (length < 0 || length > ByteArray::kMaxLength) { |
v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); |
} |
int size = ByteArray::SizeFor(length); |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
} |
- reinterpret_cast<ByteArray*>(result)->set_map_no_write_barrier( |
- byte_array_map()); |
- reinterpret_cast<ByteArray*>(result)->set_length(length); |
+ result->set_map_no_write_barrier(byte_array_map()); |
+ ByteArray::cast(result)->set_length(length); |
return result; |
} |
@@ -3318,23 +3316,21 @@ void Heap::AdjustLiveBytes(Address address, int by, InvocationMode mode) { |
} |
-MaybeObject* Heap::AllocateExternalArray(int length, |
+AllocationResult Heap::AllocateExternalArray(int length, |
ExternalArrayType array_type, |
void* external_pointer, |
PretenureFlag pretenure) { |
int size = ExternalArray::kAlignedSize; |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
} |
- reinterpret_cast<ExternalArray*>(result)->set_map_no_write_barrier( |
+ result->set_map_no_write_barrier( |
MapForExternalArrayType(array_type)); |
- reinterpret_cast<ExternalArray*>(result)->set_length(length); |
- reinterpret_cast<ExternalArray*>(result)->set_external_pointer( |
- external_pointer); |
- |
+ ExternalArray::cast(result)->set_length(length); |
+ ExternalArray::cast(result)->set_external_pointer(external_pointer); |
return result; |
} |
@@ -3359,9 +3355,9 @@ static void ForFixedTypedArray(ExternalArrayType array_type, |
} |
-MaybeObject* Heap::AllocateFixedTypedArray(int length, |
- ExternalArrayType array_type, |
- PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateFixedTypedArray(int length, |
+ ExternalArrayType array_type, |
+ PretenureFlag pretenure) { |
int element_size; |
ElementsKind elements_kind; |
ForFixedTypedArray(array_type, &element_size, &elements_kind); |
@@ -3375,36 +3371,35 @@ MaybeObject* Heap::AllocateFixedTypedArray(int length, |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
HeapObject* object; |
- MaybeObject* maybe_object = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_object->To(&object)) return maybe_object; |
+ AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&object)) return allocation; |
if (array_type == kExternalFloat64Array) { |
object = EnsureDoubleAligned(this, object, size); |
} |
- FixedTypedArrayBase* elements = |
- reinterpret_cast<FixedTypedArrayBase*>(object); |
- elements->set_map(MapForFixedTypedArray(array_type)); |
+ object->set_map(MapForFixedTypedArray(array_type)); |
+ FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object); |
elements->set_length(length); |
memset(elements->DataPtr(), 0, elements->DataSize()); |
return elements; |
} |
-MaybeObject* Heap::AllocateCode(int object_size, |
+AllocationResult Heap::AllocateCode(int object_size, |
bool immovable) { |
ASSERT(IsAligned(static_cast<intptr_t>(object_size), kCodeAlignment)); |
- MaybeObject* maybe_result; |
+ AllocationResult allocation; |
// Large code objects and code objects which should stay at a fixed address |
// are allocated in large object space. |
HeapObject* result; |
bool force_lo_space = object_size > code_space()->AreaSize(); |
if (force_lo_space) { |
- maybe_result = lo_space_->AllocateRaw(object_size, EXECUTABLE); |
+ allocation = lo_space_->AllocateRaw(object_size, EXECUTABLE); |
} else { |
- maybe_result = AllocateRaw(object_size, CODE_SPACE, CODE_SPACE); |
+ allocation = AllocateRaw(object_size, CODE_SPACE, CODE_SPACE); |
} |
- if (!maybe_result->To<HeapObject>(&result)) return maybe_result; |
+ if (!allocation.To(&result)) return allocation; |
if (immovable && !force_lo_space && |
// Objects on the first page of each space are never moved. |
@@ -3412,8 +3407,8 @@ MaybeObject* Heap::AllocateCode(int object_size, |
// Discard the first code allocation, which was on a page where it could be |
// moved. |
CreateFillerObjectAt(result->address(), object_size); |
- maybe_result = lo_space_->AllocateRaw(object_size, EXECUTABLE); |
- if (!maybe_result->To<HeapObject>(&result)) return maybe_result; |
+ allocation = lo_space_->AllocateRaw(object_size, EXECUTABLE); |
+ if (!allocation.To(&result)) return allocation; |
} |
result->set_map_no_write_barrier(code_map()); |
@@ -3426,15 +3421,15 @@ MaybeObject* Heap::AllocateCode(int object_size, |
} |
-MaybeObject* Heap::CopyCode(Code* code) { |
- MaybeObject* maybe_result; |
- Object* new_constant_pool; |
+AllocationResult Heap::CopyCode(Code* code) { |
+ AllocationResult allocation; |
+ HeapObject* new_constant_pool; |
if (FLAG_enable_ool_constant_pool && |
code->constant_pool() != empty_constant_pool_array()) { |
// Copy the constant pool, since edits to the copied code may modify |
// the constant pool. |
- maybe_result = CopyConstantPoolArray(code->constant_pool()); |
- if (!maybe_result->ToObject(&new_constant_pool)) return maybe_result; |
+ allocation = CopyConstantPoolArray(code->constant_pool()); |
+ if (!allocation.To(&new_constant_pool)) return allocation; |
} else { |
new_constant_pool = empty_constant_pool_array(); |
} |
@@ -3442,17 +3437,17 @@ MaybeObject* Heap::CopyCode(Code* code) { |
// Allocate an object the same size as the code object. |
int obj_size = code->Size(); |
if (obj_size > code_space()->AreaSize()) { |
- maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE); |
+ allocation = lo_space_->AllocateRaw(obj_size, EXECUTABLE); |
} else { |
- maybe_result = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE); |
+ allocation = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE); |
} |
- Object* result; |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ if (!allocation.To(&result)) return allocation; |
// Copy code object. |
Address old_addr = code->address(); |
- Address new_addr = reinterpret_cast<HeapObject*>(result)->address(); |
+ Address new_addr = result->address(); |
CopyBlock(new_addr, old_addr, obj_size); |
Code* new_code = Code::cast(result); |
@@ -3467,25 +3462,22 @@ MaybeObject* Heap::CopyCode(Code* code) { |
} |
-MaybeObject* Heap::CopyCode(Code* code, Vector<byte> reloc_info) { |
+AllocationResult Heap::CopyCode(Code* code, Vector<byte> reloc_info) { |
// Allocate ByteArray and ConstantPoolArray before the Code object, so that we |
// do not risk leaving uninitialized Code object (and breaking the heap). |
- Object* reloc_info_array; |
- { MaybeObject* maybe_reloc_info_array = |
+ ByteArray* reloc_info_array; |
+ { AllocationResult allocation = |
AllocateByteArray(reloc_info.length(), TENURED); |
- if (!maybe_reloc_info_array->ToObject(&reloc_info_array)) { |
- return maybe_reloc_info_array; |
- } |
+ if (!allocation.To(&reloc_info_array)) return allocation; |
} |
- Object* new_constant_pool; |
+ HeapObject* new_constant_pool; |
if (FLAG_enable_ool_constant_pool && |
code->constant_pool() != empty_constant_pool_array()) { |
// Copy the constant pool, since edits to the copied code may modify |
// the constant pool. |
- MaybeObject* maybe_constant_pool = |
+ AllocationResult allocation = |
CopyConstantPoolArray(code->constant_pool()); |
- if (!maybe_constant_pool->ToObject(&new_constant_pool)) |
- return maybe_constant_pool; |
+ if (!allocation.To(&new_constant_pool)) return allocation; |
} else { |
new_constant_pool = empty_constant_pool_array(); |
} |
@@ -3499,24 +3491,24 @@ MaybeObject* Heap::CopyCode(Code* code, Vector<byte> reloc_info) { |
size_t relocation_offset = |
static_cast<size_t>(code->instruction_end() - old_addr); |
- MaybeObject* maybe_result; |
+ AllocationResult allocation; |
if (new_obj_size > code_space()->AreaSize()) { |
- maybe_result = lo_space_->AllocateRaw(new_obj_size, EXECUTABLE); |
+ allocation = lo_space_->AllocateRaw(new_obj_size, EXECUTABLE); |
} else { |
- maybe_result = AllocateRaw(new_obj_size, CODE_SPACE, CODE_SPACE); |
+ allocation = AllocateRaw(new_obj_size, CODE_SPACE, CODE_SPACE); |
} |
- Object* result; |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ if (!allocation.To(&result)) return allocation; |
// Copy code object. |
- Address new_addr = reinterpret_cast<HeapObject*>(result)->address(); |
+ Address new_addr = result->address(); |
// Copy header and instructions. |
CopyBytes(new_addr, old_addr, relocation_offset); |
Code* new_code = Code::cast(result); |
- new_code->set_relocation_info(ByteArray::cast(reloc_info_array)); |
+ new_code->set_relocation_info(reloc_info_array); |
// Update constant pool. |
new_code->set_constant_pool(new_constant_pool); |
@@ -3532,9 +3524,7 @@ MaybeObject* Heap::CopyCode(Code* code, Vector<byte> reloc_info) { |
new_code->Relocate(new_addr - old_addr); |
#ifdef VERIFY_HEAP |
- if (FLAG_verify_heap) { |
- code->Verify(); |
- } |
+ if (FLAG_verify_heap) code->ObjectVerify(); |
#endif |
return new_code; |
} |
@@ -3551,7 +3541,7 @@ void Heap::InitializeAllocationMemento(AllocationMemento* memento, |
} |
-MaybeObject* Heap::Allocate(Map* map, AllocationSpace space, |
+AllocationResult Heap::Allocate(Map* map, AllocationSpace space, |
AllocationSite* allocation_site) { |
ASSERT(gc_state_ == NOT_IN_GC); |
ASSERT(map->instance_type() != MAP_TYPE); |
@@ -3563,11 +3553,11 @@ MaybeObject* Heap::Allocate(Map* map, AllocationSpace space, |
if (allocation_site != NULL) { |
size += AllocationMemento::kSize; |
} |
- Object* result; |
- MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ AllocationResult allocation = AllocateRaw(size, space, retry_space); |
+ if (!allocation.To(&result)) return allocation; |
// No need for write barrier since object is white and map is in old space. |
- HeapObject::cast(result)->set_map_no_write_barrier(map); |
+ result->set_map_no_write_barrier(map); |
if (allocation_site != NULL) { |
AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>( |
reinterpret_cast<Address>(result) + map->instance_size()); |
@@ -3577,7 +3567,7 @@ MaybeObject* Heap::Allocate(Map* map, AllocationSpace space, |
} |
-MaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) { |
+AllocationResult Heap::AllocateArgumentsObject(Object* callee, int length) { |
// To get fast allocation and map sharing for arguments objects we |
// allocate them based on an arguments boilerplate. |
@@ -3601,34 +3591,31 @@ MaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) { |
ASSERT(arguments_object_size == boilerplate->map()->instance_size()); |
// Do the allocation. |
- Object* result; |
- { MaybeObject* maybe_result = |
+ HeapObject* result; |
+ { AllocationResult allocation = |
AllocateRaw(arguments_object_size, NEW_SPACE, OLD_POINTER_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ if (!allocation.To(&result)) return allocation; |
} |
// Copy the content. The arguments boilerplate doesn't have any |
// fields that point to new space so it's safe to skip the write |
// barrier here. |
- CopyBlock(HeapObject::cast(result)->address(), |
- boilerplate->address(), |
- JSObject::kHeaderSize); |
+ CopyBlock(result->address(), boilerplate->address(), JSObject::kHeaderSize); |
// Set the length property. |
- JSObject::cast(result)->InObjectPropertyAtPut(kArgumentsLengthIndex, |
- Smi::FromInt(length), |
- SKIP_WRITE_BARRIER); |
+ JSObject* js_obj = JSObject::cast(result); |
+ js_obj->InObjectPropertyAtPut( |
+ kArgumentsLengthIndex, Smi::FromInt(length), SKIP_WRITE_BARRIER); |
// Set the callee property for sloppy mode arguments object only. |
if (!strict_mode_callee) { |
- JSObject::cast(result)->InObjectPropertyAtPut(kArgumentsCalleeIndex, |
- callee); |
+ js_obj->InObjectPropertyAtPut(kArgumentsCalleeIndex, callee); |
} |
// Check the state of the object |
- ASSERT(JSObject::cast(result)->HasFastProperties()); |
- ASSERT(JSObject::cast(result)->HasFastObjectElements()); |
+ ASSERT(js_obj->HasFastProperties()); |
+ ASSERT(js_obj->HasFastObjectElements()); |
- return result; |
+ return js_obj; |
} |
@@ -3664,7 +3651,7 @@ void Heap::InitializeJSObjectFromMap(JSObject* obj, |
} |
-MaybeObject* Heap::AllocateJSObjectFromMap( |
+AllocationResult Heap::AllocateJSObjectFromMap( |
Map* map, |
PretenureFlag pretenure, |
bool allocate_properties, |
@@ -3683,8 +3670,8 @@ MaybeObject* Heap::AllocateJSObjectFromMap( |
if (allocate_properties) { |
int prop_size = map->InitialPropertiesLength(); |
ASSERT(prop_size >= 0); |
- { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, pretenure); |
- if (!maybe_properties->To(&properties)) return maybe_properties; |
+ { AllocationResult allocation = AllocateFixedArray(prop_size, pretenure); |
+ if (!allocation.To(&properties)) return allocation; |
} |
} else { |
properties = empty_fixed_array(); |
@@ -3693,39 +3680,37 @@ MaybeObject* Heap::AllocateJSObjectFromMap( |
// Allocate the JSObject. |
int size = map->instance_size(); |
AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); |
- Object* obj; |
- MaybeObject* maybe_obj = Allocate(map, space, allocation_site); |
- if (!maybe_obj->To(&obj)) return maybe_obj; |
+ JSObject* js_obj; |
+ AllocationResult allocation = Allocate(map, space, allocation_site); |
+ if (!allocation.To(&js_obj)) return allocation; |
// Initialize the JSObject. |
- InitializeJSObjectFromMap(JSObject::cast(obj), properties, map); |
- ASSERT(JSObject::cast(obj)->HasFastElements() || |
- JSObject::cast(obj)->HasExternalArrayElements() || |
- JSObject::cast(obj)->HasFixedTypedArrayElements()); |
- return obj; |
+ InitializeJSObjectFromMap(js_obj, properties, map); |
+ ASSERT(js_obj->HasFastElements() || |
+ js_obj->HasExternalArrayElements() || |
+ js_obj->HasFixedTypedArrayElements()); |
+ return js_obj; |
} |
-MaybeObject* Heap::AllocateJSObject(JSFunction* constructor, |
- PretenureFlag pretenure, |
- AllocationSite* allocation_site) { |
+AllocationResult Heap::AllocateJSObject(JSFunction* constructor, |
+ PretenureFlag pretenure, |
+ AllocationSite* allocation_site) { |
ASSERT(constructor->has_initial_map()); |
// Allocate the object based on the constructors initial map. |
- MaybeObject* result = AllocateJSObjectFromMap(constructor->initial_map(), |
- pretenure, |
- true, |
- allocation_site); |
+ AllocationResult allocation = AllocateJSObjectFromMap( |
+ constructor->initial_map(), pretenure, true, allocation_site); |
#ifdef DEBUG |
// Make sure result is NOT a global object if valid. |
- Object* non_failure; |
- ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject()); |
+ HeapObject* obj; |
+ ASSERT(!allocation.To(&obj) || !obj->IsGlobalObject()); |
#endif |
- return result; |
+ return allocation; |
} |
-MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
+AllocationResult Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
// Never used to copy functions. If functions need to be copied we |
// have to be careful to clear the literals array. |
SLOW_ASSERT(!source->IsJSFunction()); |
@@ -3733,7 +3718,7 @@ MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
// Make the clone. |
Map* map = source->map(); |
int object_size = map->instance_size(); |
- Object* clone; |
+ HeapObject* clone; |
ASSERT(site == NULL || AllocationSite::CanTrack(map->instance_type())); |
@@ -3742,11 +3727,11 @@ MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
// If we're forced to always allocate, we use the general allocation |
// functions which may leave us with an object in old space. |
if (always_allocate()) { |
- { MaybeObject* maybe_clone = |
+ { AllocationResult allocation = |
AllocateRaw(object_size, NEW_SPACE, OLD_POINTER_SPACE); |
- if (!maybe_clone->ToObject(&clone)) return maybe_clone; |
+ if (!allocation.To(&clone)) return allocation; |
} |
- Address clone_address = HeapObject::cast(clone)->address(); |
+ Address clone_address = clone->address(); |
CopyBlock(clone_address, |
source->address(), |
object_size); |
@@ -3760,14 +3745,14 @@ MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
{ int adjusted_object_size = site != NULL |
? object_size + AllocationMemento::kSize |
: object_size; |
- MaybeObject* maybe_clone = |
+ AllocationResult allocation = |
AllocateRaw(adjusted_object_size, NEW_SPACE, NEW_SPACE); |
- if (!maybe_clone->ToObject(&clone)) return maybe_clone; |
+ if (!allocation.To(&clone)) return allocation; |
} |
SLOW_ASSERT(InNewSpace(clone)); |
// Since we know the clone is allocated in new space, we can copy |
// the contents without worrying about updating the write barrier. |
- CopyBlock(HeapObject::cast(clone)->address(), |
+ CopyBlock(clone->address(), |
source->address(), |
object_size); |
@@ -3784,35 +3769,35 @@ MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
FixedArray* properties = FixedArray::cast(source->properties()); |
// Update elements if necessary. |
if (elements->length() > 0) { |
- Object* elem; |
- { MaybeObject* maybe_elem; |
+ FixedArrayBase* elem; |
+ { AllocationResult allocation; |
if (elements->map() == fixed_cow_array_map()) { |
- maybe_elem = FixedArray::cast(elements); |
+ allocation = FixedArray::cast(elements); |
} else if (source->HasFastDoubleElements()) { |
- maybe_elem = CopyFixedDoubleArray(FixedDoubleArray::cast(elements)); |
+ allocation = CopyFixedDoubleArray(FixedDoubleArray::cast(elements)); |
} else { |
- maybe_elem = CopyFixedArray(FixedArray::cast(elements)); |
+ allocation = CopyFixedArray(FixedArray::cast(elements)); |
} |
- if (!maybe_elem->ToObject(&elem)) return maybe_elem; |
+ if (!allocation.To(&elem)) return allocation; |
} |
- JSObject::cast(clone)->set_elements(FixedArrayBase::cast(elem), wb_mode); |
+ JSObject::cast(clone)->set_elements(elem, wb_mode); |
} |
// Update properties if necessary. |
if (properties->length() > 0) { |
- Object* prop; |
- { MaybeObject* maybe_prop = CopyFixedArray(properties); |
- if (!maybe_prop->ToObject(&prop)) return maybe_prop; |
+ FixedArray* prop; |
+ { AllocationResult allocation = CopyFixedArray(properties); |
+ if (!allocation.To(&prop)) return allocation; |
} |
- JSObject::cast(clone)->set_properties(FixedArray::cast(prop), wb_mode); |
+ JSObject::cast(clone)->set_properties(prop, wb_mode); |
} |
// Return the new clone. |
return clone; |
} |
-MaybeObject* Heap::AllocateStringFromUtf8Slow(Vector<const char> string, |
- int non_ascii_start, |
- PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateStringFromUtf8Slow(Vector<const char> string, |
+ int non_ascii_start, |
+ PretenureFlag pretenure) { |
// Continue counting the number of characters in the UTF-8 string, starting |
// from the first non-ascii character or word. |
Access<UnicodeCache::Utf8Decoder> |
@@ -3822,18 +3807,16 @@ MaybeObject* Heap::AllocateStringFromUtf8Slow(Vector<const char> string, |
int utf16_length = decoder->Utf16Length(); |
ASSERT(utf16_length > 0); |
// Allocate string. |
- Object* result; |
+ HeapObject* result; |
{ |
int chars = non_ascii_start + utf16_length; |
- MaybeObject* maybe_result = AllocateRawTwoByteString(chars, pretenure); |
- if (!maybe_result->ToObject(&result) || result->IsException()) { |
- return maybe_result; |
+ AllocationResult allocation = AllocateRawTwoByteString(chars, pretenure); |
+ if (!allocation.To(&result) || result->IsException()) { |
+ return allocation; |
} |
} |
- // Convert and copy the characters into the new object. |
- SeqTwoByteString* twobyte = SeqTwoByteString::cast(result); |
// Copy ascii portion. |
- uint16_t* data = twobyte->GetChars(); |
+ uint16_t* data = SeqTwoByteString::cast(result)->GetChars(); |
if (non_ascii_start != 0) { |
const char* ascii_data = string.start(); |
for (int i = 0; i < non_ascii_start; i++) { |
@@ -3846,23 +3829,23 @@ MaybeObject* Heap::AllocateStringFromUtf8Slow(Vector<const char> string, |
} |
-MaybeObject* Heap::AllocateStringFromTwoByte(Vector<const uc16> string, |
- PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateStringFromTwoByte(Vector<const uc16> string, |
+ PretenureFlag pretenure) { |
// Check if the string is an ASCII string. |
- Object* result; |
+ HeapObject* result; |
int length = string.length(); |
const uc16* start = string.start(); |
if (String::IsOneByte(start, length)) { |
- MaybeObject* maybe_result = AllocateRawOneByteString(length, pretenure); |
- if (!maybe_result->ToObject(&result) || result->IsException()) { |
- return maybe_result; |
+ AllocationResult allocation = AllocateRawOneByteString(length, pretenure); |
+ if (!allocation.To(&result) || result->IsException()) { |
+ return allocation; |
} |
CopyChars(SeqOneByteString::cast(result)->GetChars(), start, length); |
} else { // It's not a one byte string. |
- MaybeObject* maybe_result = AllocateRawTwoByteString(length, pretenure); |
- if (!maybe_result->ToObject(&result) || result->IsException()) { |
- return maybe_result; |
+ AllocationResult allocation = AllocateRawTwoByteString(length, pretenure); |
+ if (!allocation.To(&result) || result->IsException()) { |
+ return allocation; |
} |
CopyChars(SeqTwoByteString::cast(result)->GetChars(), start, length); |
} |
@@ -3919,7 +3902,7 @@ static inline void WriteTwoByteData(String* s, uint16_t* chars, int len) { |
template<bool is_one_byte, typename T> |
-MaybeObject* Heap::AllocateInternalizedStringImpl( |
+AllocationResult Heap::AllocateInternalizedStringImpl( |
T t, int chars, uint32_t hash_field) { |
ASSERT(chars >= 0); |
// Compute map and object size. |
@@ -3939,12 +3922,12 @@ MaybeObject* Heap::AllocateInternalizedStringImpl( |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, TENURED); |
// Allocate string. |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
} |
- reinterpret_cast<HeapObject*>(result)->set_map_no_write_barrier(map); |
+ result->set_map_no_write_barrier(map); |
// Set length and hash fields of the allocated string. |
String* answer = String::cast(result); |
answer->set_length(chars); |
@@ -3963,17 +3946,18 @@ MaybeObject* Heap::AllocateInternalizedStringImpl( |
// Need explicit instantiations. |
template |
-MaybeObject* Heap::AllocateInternalizedStringImpl<true>(String*, int, uint32_t); |
+AllocationResult Heap::AllocateInternalizedStringImpl<true>( |
+ String*, int, uint32_t); |
template |
-MaybeObject* Heap::AllocateInternalizedStringImpl<false>( |
+AllocationResult Heap::AllocateInternalizedStringImpl<false>( |
String*, int, uint32_t); |
template |
-MaybeObject* Heap::AllocateInternalizedStringImpl<false>( |
+AllocationResult Heap::AllocateInternalizedStringImpl<false>( |
Vector<const char>, int, uint32_t); |
-MaybeObject* Heap::AllocateRawOneByteString(int length, |
- PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateRawOneByteString(int length, |
+ PretenureFlag pretenure) { |
if (length < 0 || length > String::kMaxLength) { |
return isolate()->ThrowInvalidStringLength(); |
} |
@@ -3981,13 +3965,13 @@ MaybeObject* Heap::AllocateRawOneByteString(int length, |
ASSERT(size <= SeqOneByteString::kMaxSize); |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
} |
// Partially initialize the object. |
- HeapObject::cast(result)->set_map_no_write_barrier(ascii_string_map()); |
+ result->set_map_no_write_barrier(ascii_string_map()); |
String::cast(result)->set_length(length); |
String::cast(result)->set_hash_field(String::kEmptyHashField); |
ASSERT_EQ(size, HeapObject::cast(result)->Size()); |
@@ -3996,8 +3980,8 @@ MaybeObject* Heap::AllocateRawOneByteString(int length, |
} |
-MaybeObject* Heap::AllocateRawTwoByteString(int length, |
- PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateRawTwoByteString(int length, |
+ PretenureFlag pretenure) { |
if (length < 0 || length > String::kMaxLength) { |
return isolate()->ThrowInvalidStringLength(); |
} |
@@ -4005,13 +3989,13 @@ MaybeObject* Heap::AllocateRawTwoByteString(int length, |
ASSERT(size <= SeqTwoByteString::kMaxSize); |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&result)) return allocation; |
} |
// Partially initialize the object. |
- HeapObject::cast(result)->set_map_no_write_barrier(string_map()); |
+ result->set_map_no_write_barrier(string_map()); |
String::cast(result)->set_length(length); |
String::cast(result)->set_hash_field(String::kEmptyHashField); |
ASSERT_EQ(size, HeapObject::cast(result)->Size()); |
@@ -4019,37 +4003,37 @@ MaybeObject* Heap::AllocateRawTwoByteString(int length, |
} |
-MaybeObject* Heap::AllocateEmptyFixedArray() { |
+AllocationResult Heap::AllocateEmptyFixedArray() { |
int size = FixedArray::SizeFor(0); |
- Object* result; |
- { MaybeObject* maybe_result = |
+ HeapObject* result; |
+ { AllocationResult allocation = |
AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ if (!allocation.To(&result)) return allocation; |
} |
// Initialize the object. |
- reinterpret_cast<FixedArray*>(result)->set_map_no_write_barrier( |
- fixed_array_map()); |
- reinterpret_cast<FixedArray*>(result)->set_length(0); |
+ result->set_map_no_write_barrier(fixed_array_map()); |
+ FixedArray::cast(result)->set_length(0); |
return result; |
} |
-MaybeObject* Heap::AllocateEmptyExternalArray(ExternalArrayType array_type) { |
+AllocationResult Heap::AllocateEmptyExternalArray( |
+ ExternalArrayType array_type) { |
return AllocateExternalArray(0, array_type, NULL, TENURED); |
} |
-MaybeObject* Heap::CopyAndTenureFixedCOWArray(FixedArray* src) { |
+AllocationResult Heap::CopyAndTenureFixedCOWArray(FixedArray* src) { |
if (!InNewSpace(src)) { |
return src; |
} |
int len = src->length(); |
- Object* obj; |
- { MaybeObject* maybe_obj = AllocateRawFixedArray(len, TENURED); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ HeapObject* obj; |
+ { AllocationResult allocation = AllocateRawFixedArray(len, TENURED); |
+ if (!allocation.To(&obj)) return allocation; |
} |
- HeapObject::cast(obj)->set_map_no_write_barrier(fixed_array_map()); |
+ obj->set_map_no_write_barrier(fixed_array_map()); |
FixedArray* result = FixedArray::cast(obj); |
result->set_length(len); |
@@ -4066,26 +4050,26 @@ MaybeObject* Heap::CopyAndTenureFixedCOWArray(FixedArray* src) { |
} |
-MaybeObject* Heap::AllocateEmptyFixedTypedArray(ExternalArrayType array_type) { |
+AllocationResult Heap::AllocateEmptyFixedTypedArray( |
+ ExternalArrayType array_type) { |
return AllocateFixedTypedArray(0, array_type, TENURED); |
} |
-MaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { |
+AllocationResult Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { |
int len = src->length(); |
- Object* obj; |
- { MaybeObject* maybe_obj = AllocateRawFixedArray(len, NOT_TENURED); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ HeapObject* obj; |
+ { AllocationResult allocation = AllocateRawFixedArray(len, NOT_TENURED); |
+ if (!allocation.To(&obj)) return allocation; |
} |
if (InNewSpace(obj)) { |
- HeapObject* dst = HeapObject::cast(obj); |
- dst->set_map_no_write_barrier(map); |
- CopyBlock(dst->address() + kPointerSize, |
+ obj->set_map_no_write_barrier(map); |
+ CopyBlock(obj->address() + kPointerSize, |
src->address() + kPointerSize, |
FixedArray::SizeFor(len) - kPointerSize); |
return obj; |
} |
- HeapObject::cast(obj)->set_map_no_write_barrier(map); |
+ obj->set_map_no_write_barrier(map); |
FixedArray* result = FixedArray::cast(obj); |
result->set_length(len); |
@@ -4097,48 +4081,47 @@ MaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { |
} |
-MaybeObject* Heap::CopyFixedDoubleArrayWithMap(FixedDoubleArray* src, |
- Map* map) { |
+AllocationResult Heap::CopyFixedDoubleArrayWithMap(FixedDoubleArray* src, |
+ Map* map) { |
int len = src->length(); |
- Object* obj; |
- { MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(len, NOT_TENURED); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ HeapObject* obj; |
+ { AllocationResult allocation = AllocateRawFixedDoubleArray(len, NOT_TENURED); |
+ if (!allocation.To(&obj)) return allocation; |
} |
- HeapObject* dst = HeapObject::cast(obj); |
- dst->set_map_no_write_barrier(map); |
+ obj->set_map_no_write_barrier(map); |
CopyBlock( |
- dst->address() + FixedDoubleArray::kLengthOffset, |
+ obj->address() + FixedDoubleArray::kLengthOffset, |
src->address() + FixedDoubleArray::kLengthOffset, |
FixedDoubleArray::SizeFor(len) - FixedDoubleArray::kLengthOffset); |
return obj; |
} |
-MaybeObject* Heap::CopyConstantPoolArrayWithMap(ConstantPoolArray* src, |
- Map* map) { |
+AllocationResult Heap::CopyConstantPoolArrayWithMap(ConstantPoolArray* src, |
+ Map* map) { |
int int64_entries = src->count_of_int64_entries(); |
int code_ptr_entries = src->count_of_code_ptr_entries(); |
int heap_ptr_entries = src->count_of_heap_ptr_entries(); |
int int32_entries = src->count_of_int32_entries(); |
- Object* obj; |
- { MaybeObject* maybe_obj = |
+ HeapObject* obj; |
+ { AllocationResult allocation = |
AllocateConstantPoolArray(int64_entries, code_ptr_entries, |
heap_ptr_entries, int32_entries); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ if (!allocation.To(&obj)) return allocation; |
} |
- HeapObject* dst = HeapObject::cast(obj); |
- dst->set_map_no_write_barrier(map); |
+ obj->set_map_no_write_barrier(map); |
int size = ConstantPoolArray::SizeFor( |
int64_entries, code_ptr_entries, heap_ptr_entries, int32_entries); |
CopyBlock( |
- dst->address() + ConstantPoolArray::kLengthOffset, |
+ obj->address() + ConstantPoolArray::kLengthOffset, |
src->address() + ConstantPoolArray::kLengthOffset, |
size - ConstantPoolArray::kLengthOffset); |
return obj; |
} |
-MaybeObject* Heap::AllocateRawFixedArray(int length, PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateRawFixedArray(int length, |
+ PretenureFlag pretenure) { |
if (length < 0 || length > FixedArray::kMaxLength) { |
v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); |
} |
@@ -4149,20 +4132,20 @@ MaybeObject* Heap::AllocateRawFixedArray(int length, PretenureFlag pretenure) { |
} |
-MaybeObject* Heap::AllocateFixedArrayWithFiller(int length, |
- PretenureFlag pretenure, |
- Object* filler) { |
+AllocationResult Heap::AllocateFixedArrayWithFiller(int length, |
+ PretenureFlag pretenure, |
+ Object* filler) { |
ASSERT(length >= 0); |
ASSERT(empty_fixed_array()->IsFixedArray()); |
if (length == 0) return empty_fixed_array(); |
ASSERT(!InNewSpace(filler)); |
- Object* result; |
- { MaybeObject* maybe_result = AllocateRawFixedArray(length, pretenure); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ HeapObject* result; |
+ { AllocationResult allocation = AllocateRawFixedArray(length, pretenure); |
+ if (!allocation.To(&result)) return allocation; |
} |
- HeapObject::cast(result)->set_map_no_write_barrier(fixed_array_map()); |
+ result->set_map_no_write_barrier(fixed_array_map()); |
FixedArray* array = FixedArray::cast(result); |
array->set_length(length); |
MemsetPointer(array->data_start(), filler, length); |
@@ -4170,45 +4153,42 @@ MaybeObject* Heap::AllocateFixedArrayWithFiller(int length, |
} |
-MaybeObject* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
return AllocateFixedArrayWithFiller(length, pretenure, undefined_value()); |
} |
-MaybeObject* Heap::AllocateUninitializedFixedArray(int length) { |
+AllocationResult Heap::AllocateUninitializedFixedArray(int length) { |
if (length == 0) return empty_fixed_array(); |
- Object* obj; |
- { MaybeObject* maybe_obj = AllocateRawFixedArray(length, NOT_TENURED); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ HeapObject* obj; |
+ { AllocationResult allocation = AllocateRawFixedArray(length, NOT_TENURED); |
+ if (!allocation.To(&obj)) return allocation; |
} |
- reinterpret_cast<FixedArray*>(obj)->set_map_no_write_barrier( |
- fixed_array_map()); |
+ obj->set_map_no_write_barrier(fixed_array_map()); |
FixedArray::cast(obj)->set_length(length); |
return obj; |
} |
-MaybeObject* Heap::AllocateUninitializedFixedDoubleArray( |
+AllocationResult Heap::AllocateUninitializedFixedDoubleArray( |
int length, |
PretenureFlag pretenure) { |
if (length == 0) return empty_fixed_array(); |
- Object* elements_object; |
- MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(length, pretenure); |
- if (!maybe_obj->ToObject(&elements_object)) return maybe_obj; |
- FixedDoubleArray* elements = |
- reinterpret_cast<FixedDoubleArray*>(elements_object); |
+ HeapObject* elements; |
+ AllocationResult allocation = AllocateRawFixedDoubleArray(length, pretenure); |
+ if (!allocation.To(&elements)) return allocation; |
elements->set_map_no_write_barrier(fixed_double_array_map()); |
- elements->set_length(length); |
+ FixedDoubleArray::cast(elements)->set_length(length); |
return elements; |
} |
-MaybeObject* Heap::AllocateRawFixedDoubleArray(int length, |
- PretenureFlag pretenure) { |
+AllocationResult Heap::AllocateRawFixedDoubleArray(int length, |
+ PretenureFlag pretenure) { |
if (length < 0 || length > FixedDoubleArray::kMaxLength) { |
v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); |
} |
@@ -4219,18 +4199,18 @@ MaybeObject* Heap::AllocateRawFixedDoubleArray(int length, |
AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
HeapObject* object; |
- { MaybeObject* maybe_object = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (!maybe_object->To<HeapObject>(&object)) return maybe_object; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!allocation.To(&object)) return allocation; |
} |
return EnsureDoubleAligned(this, object, size); |
} |
-MaybeObject* Heap::AllocateConstantPoolArray(int number_of_int64_entries, |
- int number_of_code_ptr_entries, |
- int number_of_heap_ptr_entries, |
- int number_of_int32_entries) { |
+AllocationResult Heap::AllocateConstantPoolArray(int number_of_int64_entries, |
+ int number_of_code_ptr_entries, |
+ int number_of_heap_ptr_entries, |
+ int number_of_int32_entries) { |
CHECK(number_of_int64_entries >= 0 && |
number_of_int64_entries <= ConstantPoolArray::kMaxEntriesPerType && |
number_of_code_ptr_entries >= 0 && |
@@ -4249,14 +4229,13 @@ MaybeObject* Heap::AllocateConstantPoolArray(int number_of_int64_entries, |
AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, TENURED); |
HeapObject* object; |
- { MaybeObject* maybe_object = AllocateRaw(size, space, OLD_POINTER_SPACE); |
- if (!maybe_object->To<HeapObject>(&object)) return maybe_object; |
+ { AllocationResult allocation = AllocateRaw(size, space, OLD_POINTER_SPACE); |
+ if (!allocation.To(&object)) return allocation; |
} |
object = EnsureDoubleAligned(this, object, size); |
- HeapObject::cast(object)->set_map_no_write_barrier(constant_pool_array_map()); |
+ object->set_map_no_write_barrier(constant_pool_array_map()); |
- ConstantPoolArray* constant_pool = |
- reinterpret_cast<ConstantPoolArray*>(object); |
+ ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); |
constant_pool->Init(number_of_int64_entries, |
number_of_code_ptr_entries, |
number_of_heap_ptr_entries, |
@@ -4281,29 +4260,29 @@ MaybeObject* Heap::AllocateConstantPoolArray(int number_of_int64_entries, |
} |
-MaybeObject* Heap::AllocateEmptyConstantPoolArray() { |
+AllocationResult Heap::AllocateEmptyConstantPoolArray() { |
int size = ConstantPoolArray::SizeFor(0, 0, 0, 0); |
- Object* result; |
- { MaybeObject* maybe_result = |
+ HeapObject* result; |
+ { AllocationResult allocation = |
AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ if (!allocation.To(&result)) return allocation; |
} |
- HeapObject::cast(result)->set_map_no_write_barrier(constant_pool_array_map()); |
+ result->set_map_no_write_barrier(constant_pool_array_map()); |
ConstantPoolArray::cast(result)->Init(0, 0, 0, 0); |
return result; |
} |
-MaybeObject* Heap::AllocateSymbol() { |
+AllocationResult Heap::AllocateSymbol() { |
// Statically ensure that it is safe to allocate symbols in paged spaces. |
STATIC_ASSERT(Symbol::kSize <= Page::kMaxRegularHeapObjectSize); |
- Object* result; |
- MaybeObject* maybe = |
+ HeapObject* result; |
+ AllocationResult allocation = |
AllocateRaw(Symbol::kSize, OLD_POINTER_SPACE, OLD_POINTER_SPACE); |
- if (!maybe->ToObject(&result)) return maybe; |
+ if (!allocation.To(&result)) return allocation; |
- HeapObject::cast(result)->set_map_no_write_barrier(symbol_map()); |
+ result->set_map_no_write_barrier(symbol_map()); |
// Generate a random hash value. |
int hash; |
@@ -4324,7 +4303,7 @@ MaybeObject* Heap::AllocateSymbol() { |
} |
-MaybeObject* Heap::AllocateStruct(InstanceType type) { |
+AllocationResult Heap::AllocateStruct(InstanceType type) { |
Map* map; |
switch (type) { |
#define MAKE_CASE(NAME, Name, name) \ |
@@ -4337,11 +4316,11 @@ STRUCT_LIST(MAKE_CASE) |
} |
int size = map->instance_size(); |
AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, TENURED); |
- Object* result; |
- { MaybeObject* maybe_result = Allocate(map, space); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ Struct* result; |
+ { AllocationResult allocation = Allocate(map, space); |
+ if (!allocation.To(&result)) return allocation; |
} |
- Struct::cast(result)->InitializeBody(size); |
+ result->InitializeBody(size); |
return result; |
} |
@@ -4640,8 +4619,10 @@ bool Heap::InSpace(Address addr, AllocationSpace space) { |
return property_cell_space_->Contains(addr); |
case LO_SPACE: |
return lo_space_->SlowContains(addr); |
+ default: |
+ break; |
} |
- |
+ UNREACHABLE(); |
return false; |
} |