Index: src/heap.cc |
=================================================================== |
--- src/heap.cc (revision 5696) |
+++ src/heap.cc (working copy) |
@@ -802,11 +802,12 @@ |
Object* Heap::FindCodeObject(Address a) { |
- Object* obj = code_space_->FindObject(a); |
- if (obj->IsFailure()) { |
- obj = lo_space_->FindObject(a); |
+ Object* obj = NULL; // Initialization to please compiler. |
+ { MaybeObject* maybe_obj = code_space_->FindObject(a); |
+ if (!maybe_obj->ToObject(&obj)) { |
+ obj = lo_space_->FindObject(a)->ToObjectUnchecked(); |
+ } |
} |
- ASSERT(!obj->IsFailure()); |
return obj; |
} |
@@ -1260,20 +1261,21 @@ |
ASSERT(object->Size() == object_size); |
if (Heap::ShouldBePromoted(object->address(), object_size)) { |
- Object* result; |
+ MaybeObject* maybe_result; |
if ((size_restriction != SMALL) && |
(object_size > Page::kMaxHeapObjectSize)) { |
- result = Heap::lo_space()->AllocateRawFixedArray(object_size); |
+ maybe_result = Heap::lo_space()->AllocateRawFixedArray(object_size); |
} else { |
if (object_contents == DATA_OBJECT) { |
- result = Heap::old_data_space()->AllocateRaw(object_size); |
+ maybe_result = Heap::old_data_space()->AllocateRaw(object_size); |
} else { |
- result = Heap::old_pointer_space()->AllocateRaw(object_size); |
+ maybe_result = Heap::old_pointer_space()->AllocateRaw(object_size); |
} |
} |
- if (!result->IsFailure()) { |
+ Object* result = NULL; // Initialization to please compiler. |
+ if (maybe_result->ToObject(&result)) { |
HeapObject* target = HeapObject::cast(result); |
*slot = MigrateObject(object, target, object_size); |
@@ -1285,8 +1287,8 @@ |
return; |
} |
} |
- Object* result = Heap::new_space()->AllocateRaw(object_size); |
- ASSERT(!result->IsFailure()); |
+ Object* result = |
+ Heap::new_space()->AllocateRaw(object_size)->ToObjectUnchecked(); |
*slot = MigrateObject(object, HeapObject::cast(result), object_size); |
return; |
} |
@@ -1408,10 +1410,12 @@ |
} |
-Object* Heap::AllocatePartialMap(InstanceType instance_type, |
- int instance_size) { |
- Object* result = AllocateRawMap(); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocatePartialMap(InstanceType instance_type, |
+ int instance_size) { |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawMap(); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Map::cast cannot be used due to uninitialized map field. |
reinterpret_cast<Map*>(result)->set_map(raw_unchecked_meta_map()); |
@@ -1429,9 +1433,11 @@ |
} |
-Object* Heap::AllocateMap(InstanceType instance_type, int instance_size) { |
- Object* result = AllocateRawMap(); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateMap(InstanceType instance_type, int instance_size) { |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawMap(); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
Map* map = reinterpret_cast<Map*>(result); |
map->set_map(meta_map()); |
@@ -1459,9 +1465,11 @@ |
} |
-Object* Heap::AllocateCodeCache() { |
- Object* result = AllocateStruct(CODE_CACHE_TYPE); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateCodeCache() { |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateStruct(CODE_CACHE_TYPE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
CodeCache* code_cache = CodeCache::cast(result); |
code_cache->set_default_cache(empty_fixed_array()); |
code_cache->set_normal_type_cache(undefined_value()); |
@@ -1494,33 +1502,41 @@ |
bool Heap::CreateInitialMaps() { |
- Object* obj = AllocatePartialMap(MAP_TYPE, Map::kSize); |
- if (obj->IsFailure()) return false; |
+ Object* obj; |
+ { MaybeObject* maybe_obj = AllocatePartialMap(MAP_TYPE, Map::kSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
// Map::cast cannot be used due to uninitialized map field. |
Map* new_meta_map = reinterpret_cast<Map*>(obj); |
set_meta_map(new_meta_map); |
new_meta_map->set_map(new_meta_map); |
- obj = AllocatePartialMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocatePartialMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_fixed_array_map(Map::cast(obj)); |
- obj = AllocatePartialMap(ODDBALL_TYPE, Oddball::kSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocatePartialMap(ODDBALL_TYPE, Oddball::kSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_oddball_map(Map::cast(obj)); |
// Allocate the empty array. |
- obj = AllocateEmptyFixedArray(); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateEmptyFixedArray(); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_empty_fixed_array(FixedArray::cast(obj)); |
- obj = Allocate(oddball_map(), OLD_DATA_SPACE); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = Allocate(oddball_map(), OLD_DATA_SPACE); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_null_value(obj); |
// Allocate the empty descriptor array. |
- obj = AllocateEmptyFixedArray(); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateEmptyFixedArray(); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_empty_descriptor_array(DescriptorArray::cast(obj)); |
// Fix the instance_descriptors for the existing maps. |
@@ -1543,124 +1559,157 @@ |
oddball_map()->set_prototype(null_value()); |
oddball_map()->set_constructor(null_value()); |
- obj = AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_fixed_cow_array_map(Map::cast(obj)); |
ASSERT(fixed_array_map() != fixed_cow_array_map()); |
- obj = AllocateMap(HEAP_NUMBER_TYPE, HeapNumber::kSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(HEAP_NUMBER_TYPE, HeapNumber::kSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_heap_number_map(Map::cast(obj)); |
- obj = AllocateMap(PROXY_TYPE, Proxy::kSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(PROXY_TYPE, Proxy::kSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_proxy_map(Map::cast(obj)); |
for (unsigned i = 0; i < ARRAY_SIZE(string_type_table); i++) { |
const StringTypeTable& entry = string_type_table[i]; |
- obj = AllocateMap(entry.type, entry.size); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
roots_[entry.index] = Map::cast(obj); |
} |
- obj = AllocateMap(STRING_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(STRING_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_undetectable_string_map(Map::cast(obj)); |
Map::cast(obj)->set_is_undetectable(); |
- obj = AllocateMap(ASCII_STRING_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(ASCII_STRING_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_undetectable_ascii_string_map(Map::cast(obj)); |
Map::cast(obj)->set_is_undetectable(); |
- obj = AllocateMap(BYTE_ARRAY_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(BYTE_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_byte_array_map(Map::cast(obj)); |
- obj = AllocateMap(PIXEL_ARRAY_TYPE, PixelArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(PIXEL_ARRAY_TYPE, PixelArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_pixel_array_map(Map::cast(obj)); |
- obj = AllocateMap(EXTERNAL_BYTE_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_BYTE_ARRAY_TYPE, |
+ ExternalArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_external_byte_array_map(Map::cast(obj)); |
- obj = AllocateMap(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, |
+ ExternalArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_external_unsigned_byte_array_map(Map::cast(obj)); |
- obj = AllocateMap(EXTERNAL_SHORT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_SHORT_ARRAY_TYPE, |
+ ExternalArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_external_short_array_map(Map::cast(obj)); |
- obj = AllocateMap(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, |
+ ExternalArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_external_unsigned_short_array_map(Map::cast(obj)); |
- obj = AllocateMap(EXTERNAL_INT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_INT_ARRAY_TYPE, |
+ ExternalArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_external_int_array_map(Map::cast(obj)); |
- obj = AllocateMap(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, |
+ ExternalArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_external_unsigned_int_array_map(Map::cast(obj)); |
- obj = AllocateMap(EXTERNAL_FLOAT_ARRAY_TYPE, |
- ExternalArray::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_FLOAT_ARRAY_TYPE, |
+ ExternalArray::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_external_float_array_map(Map::cast(obj)); |
- obj = AllocateMap(CODE_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(CODE_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_code_map(Map::cast(obj)); |
- obj = AllocateMap(JS_GLOBAL_PROPERTY_CELL_TYPE, |
- JSGlobalPropertyCell::kSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(JS_GLOBAL_PROPERTY_CELL_TYPE, |
+ JSGlobalPropertyCell::kSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_global_property_cell_map(Map::cast(obj)); |
- obj = AllocateMap(FILLER_TYPE, kPointerSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(FILLER_TYPE, kPointerSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_one_pointer_filler_map(Map::cast(obj)); |
- obj = AllocateMap(FILLER_TYPE, 2 * kPointerSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(FILLER_TYPE, 2 * kPointerSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_two_pointer_filler_map(Map::cast(obj)); |
for (unsigned i = 0; i < ARRAY_SIZE(struct_table); i++) { |
const StructTable& entry = struct_table[i]; |
- obj = AllocateMap(entry.type, entry.size); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
roots_[entry.index] = Map::cast(obj); |
} |
- obj = AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_hash_table_map(Map::cast(obj)); |
- obj = AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_context_map(Map::cast(obj)); |
- obj = AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_catch_context_map(Map::cast(obj)); |
- obj = AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
Map* global_context_map = Map::cast(obj); |
global_context_map->set_visitor_id(StaticVisitorBase::kVisitGlobalContext); |
set_global_context_map(global_context_map); |
- obj = AllocateMap(SHARED_FUNCTION_INFO_TYPE, |
- SharedFunctionInfo::kAlignedSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(SHARED_FUNCTION_INFO_TYPE, |
+ SharedFunctionInfo::kAlignedSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_shared_function_info_map(Map::cast(obj)); |
ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); |
@@ -1668,14 +1717,17 @@ |
} |
-Object* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { |
// Statically ensure that it is safe to allocate heap numbers in paged |
// spaces. |
STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); |
AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
- Object* result = AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
HeapObject::cast(result)->set_map(heap_number_map()); |
HeapNumber::cast(result)->set_value(value); |
@@ -1683,7 +1735,7 @@ |
} |
-Object* Heap::AllocateHeapNumber(double value) { |
+MaybeObject* Heap::AllocateHeapNumber(double value) { |
// Use general version, if we're forced to always allocate. |
if (always_allocate()) return AllocateHeapNumber(value, TENURED); |
@@ -1691,27 +1743,33 @@ |
// allocation in new space. |
STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); |
ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); |
- Object* result = new_space_.AllocateRaw(HeapNumber::kSize); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = new_space_.AllocateRaw(HeapNumber::kSize); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
HeapObject::cast(result)->set_map(heap_number_map()); |
HeapNumber::cast(result)->set_value(value); |
return result; |
} |
-Object* Heap::AllocateJSGlobalPropertyCell(Object* value) { |
- Object* result = AllocateRawCell(); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateJSGlobalPropertyCell(Object* value) { |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawCell(); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
HeapObject::cast(result)->set_map(global_property_cell_map()); |
JSGlobalPropertyCell::cast(result)->set_value(value); |
return result; |
} |
-Object* Heap::CreateOddball(const char* to_string, |
- Object* to_number) { |
- Object* result = Allocate(oddball_map(), OLD_DATA_SPACE); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::CreateOddball(const char* to_string, |
+ Object* to_number) { |
+ Object* result; |
+ { MaybeObject* maybe_result = Allocate(oddball_map(), OLD_DATA_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
return Oddball::cast(result)->Initialize(to_string, to_number); |
} |
@@ -1719,14 +1777,18 @@ |
bool Heap::CreateApiObjects() { |
Object* obj; |
- obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_neander_map(Map::cast(obj)); |
- obj = Heap::AllocateJSObjectFromMap(neander_map()); |
- if (obj->IsFailure()) return false; |
- Object* elements = AllocateFixedArray(2); |
- if (elements->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = Heap::AllocateJSObjectFromMap(neander_map()); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
+ Object* elements; |
+ { MaybeObject* maybe_elements = AllocateFixedArray(2); |
+ if (!maybe_elements->ToObject(&elements)) return false; |
+ } |
FixedArray::cast(elements)->set(0, Smi::FromInt(0)); |
JSObject::cast(obj)->set_elements(FixedArray::cast(elements)); |
set_message_listeners(JSObject::cast(obj)); |
@@ -1788,64 +1850,82 @@ |
Object* obj; |
// The -0 value must be set before NumberFromDouble works. |
- obj = AllocateHeapNumber(-0.0, TENURED); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateHeapNumber(-0.0, TENURED); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_minus_zero_value(obj); |
ASSERT(signbit(minus_zero_value()->Number()) != 0); |
- obj = AllocateHeapNumber(OS::nan_value(), TENURED); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateHeapNumber(OS::nan_value(), TENURED); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_nan_value(obj); |
- obj = Allocate(oddball_map(), OLD_DATA_SPACE); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = Allocate(oddball_map(), OLD_DATA_SPACE); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_undefined_value(obj); |
ASSERT(!InNewSpace(undefined_value())); |
// Allocate initial symbol table. |
- obj = SymbolTable::Allocate(kInitialSymbolTableSize); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = SymbolTable::Allocate(kInitialSymbolTableSize); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
// Don't use set_symbol_table() due to asserts. |
roots_[kSymbolTableRootIndex] = obj; |
// Assign the print strings for oddballs after creating symboltable. |
- Object* symbol = LookupAsciiSymbol("undefined"); |
- if (symbol->IsFailure()) return false; |
+ Object* symbol; |
+ { MaybeObject* maybe_symbol = LookupAsciiSymbol("undefined"); |
+ if (!maybe_symbol->ToObject(&symbol)) return false; |
+ } |
Oddball::cast(undefined_value())->set_to_string(String::cast(symbol)); |
Oddball::cast(undefined_value())->set_to_number(nan_value()); |
// Allocate the null_value |
- obj = Oddball::cast(null_value())->Initialize("null", Smi::FromInt(0)); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ Oddball::cast(null_value())->Initialize("null", Smi::FromInt(0)); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
- obj = CreateOddball("true", Smi::FromInt(1)); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = CreateOddball("true", Smi::FromInt(1)); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_true_value(obj); |
- obj = CreateOddball("false", Smi::FromInt(0)); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = CreateOddball("false", Smi::FromInt(0)); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_false_value(obj); |
- obj = CreateOddball("hole", Smi::FromInt(-1)); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = CreateOddball("hole", Smi::FromInt(-1)); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_the_hole_value(obj); |
- obj = CreateOddball("no_interceptor_result_sentinel", Smi::FromInt(-2)); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ CreateOddball("no_interceptor_result_sentinel", Smi::FromInt(-2)); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_no_interceptor_result_sentinel(obj); |
- obj = CreateOddball("termination_exception", Smi::FromInt(-3)); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ CreateOddball("termination_exception", Smi::FromInt(-3)); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_termination_exception(obj); |
// Allocate the empty string. |
- obj = AllocateRawAsciiString(0, TENURED); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateRawAsciiString(0, TENURED); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_empty_string(String::cast(obj)); |
for (unsigned i = 0; i < ARRAY_SIZE(constant_symbol_table); i++) { |
- obj = LookupAsciiSymbol(constant_symbol_table[i].contents); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ LookupAsciiSymbol(constant_symbol_table[i].contents); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
roots_[constant_symbol_table[i].index] = String::cast(obj); |
} |
@@ -1855,25 +1935,31 @@ |
// loop above because it needs to be allocated manually with the special |
// hash code in place. The hash code for the hidden_symbol is zero to ensure |
// that it will always be at the first entry in property descriptors. |
- obj = AllocateSymbol(CStrVector(""), 0, String::kZeroHash); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateSymbol(CStrVector(""), 0, String::kZeroHash); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
hidden_symbol_ = String::cast(obj); |
// Allocate the proxy for __proto__. |
- obj = AllocateProxy((Address) &Accessors::ObjectPrototype); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateProxy((Address) &Accessors::ObjectPrototype); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_prototype_accessors(Proxy::cast(obj)); |
// Allocate the code_stubs dictionary. The initial size is set to avoid |
// expanding the dictionary during bootstrapping. |
- obj = NumberDictionary::Allocate(128); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = NumberDictionary::Allocate(128); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_code_stubs(NumberDictionary::cast(obj)); |
// Allocate the non_monomorphic_cache used in stub-cache.cc. The initial size |
// is set to avoid expanding the dictionary during bootstrapping. |
- obj = NumberDictionary::Allocate(64); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = NumberDictionary::Allocate(64); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_non_monomorphic_cache(NumberDictionary::cast(obj)); |
set_instanceof_cache_function(Smi::FromInt(0)); |
@@ -1883,22 +1969,27 @@ |
CreateFixedStubs(); |
// Allocate the dictionary of intrinsic function names. |
- obj = StringDictionary::Allocate(Runtime::kNumFunctions); |
- if (obj->IsFailure()) return false; |
- obj = Runtime::InitializeIntrinsicFunctionNames(obj); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = StringDictionary::Allocate(Runtime::kNumFunctions); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
+ { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(obj); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_intrinsic_function_names(StringDictionary::cast(obj)); |
if (InitializeNumberStringCache()->IsFailure()) return false; |
// Allocate cache for single character ASCII strings. |
- obj = AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = |
+ AllocateFixedArray(String::kMaxAsciiCharCode + 1, TENURED); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_single_character_string_cache(FixedArray::cast(obj)); |
// Allocate cache for external strings pointing to native source code. |
- obj = AllocateFixedArray(Natives::GetBuiltinsCount()); |
- if (obj->IsFailure()) return false; |
+ { MaybeObject* maybe_obj = AllocateFixedArray(Natives::GetBuiltinsCount()); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
set_natives_source_cache(FixedArray::cast(obj)); |
// Handling of script id generation is in Factory::NewScript. |
@@ -1920,15 +2011,17 @@ |
} |
-Object* Heap::InitializeNumberStringCache() { |
+MaybeObject* Heap::InitializeNumberStringCache() { |
// Compute the size of the number string cache based on the max heap size. |
// max_semispace_size_ == 512 KB => number_string_cache_size = 32. |
// max_semispace_size_ == 8 MB => number_string_cache_size = 16KB. |
int number_string_cache_size = max_semispace_size_ / 512; |
number_string_cache_size = Max(32, Min(16*KB, number_string_cache_size)); |
- Object* obj = AllocateFixedArray(number_string_cache_size * 2, TENURED); |
- if (!obj->IsFailure()) set_number_string_cache(FixedArray::cast(obj)); |
- return obj; |
+ Object* obj; |
+ MaybeObject* maybe_obj = |
+ AllocateFixedArray(number_string_cache_size * 2, TENURED); |
+ if (maybe_obj->ToObject(&obj)) set_number_string_cache(FixedArray::cast(obj)); |
+ return maybe_obj; |
} |
@@ -1986,7 +2079,8 @@ |
} |
-Object* Heap::NumberToString(Object* number, bool check_number_string_cache) { |
+MaybeObject* Heap::NumberToString(Object* number, |
+ bool check_number_string_cache) { |
Counters::number_to_string_runtime.Increment(); |
if (check_number_string_cache) { |
Object* cached = GetNumberStringCache(number); |
@@ -2005,12 +2099,13 @@ |
double num = HeapNumber::cast(number)->value(); |
str = DoubleToCString(num, buffer); |
} |
- Object* result = AllocateStringFromAscii(CStrVector(str)); |
- if (!result->IsFailure()) { |
- SetNumberStringCache(number, String::cast(result)); |
+ Object* js_string; |
+ MaybeObject* maybe_js_string = AllocateStringFromAscii(CStrVector(str)); |
+ if (maybe_js_string->ToObject(&js_string)) { |
+ SetNumberStringCache(number, String::cast(js_string)); |
} |
- return result; |
+ return maybe_js_string; |
} |
@@ -2043,7 +2138,7 @@ |
} |
-Object* Heap::NumberFromDouble(double value, PretenureFlag pretenure) { |
+MaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) { |
// We need to distinguish the minus zero value and this cannot be |
// done after conversion to int. Doing this by comparing bit |
// patterns is faster than using fpclassify() et al. |
@@ -2064,21 +2159,26 @@ |
} |
-Object* Heap::AllocateProxy(Address proxy, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateProxy(Address proxy, PretenureFlag pretenure) { |
// Statically ensure that it is safe to allocate proxies in paged spaces. |
STATIC_ASSERT(Proxy::kSize <= Page::kMaxHeapObjectSize); |
AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
- Object* result = Allocate(proxy_map(), space); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Allocate(proxy_map(), space); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
Proxy::cast(result)->set_proxy(proxy); |
return result; |
} |
-Object* Heap::AllocateSharedFunctionInfo(Object* name) { |
- Object* result = Allocate(shared_function_info_map(), OLD_POINTER_SPACE); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateSharedFunctionInfo(Object* name) { |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ Allocate(shared_function_info_map(), OLD_POINTER_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
SharedFunctionInfo* share = SharedFunctionInfo::cast(result); |
share->set_name(name); |
@@ -2114,7 +2214,9 @@ |
} |
-static inline Object* MakeOrFindTwoCharacterString(uint32_t c1, uint32_t c2) { |
+MUST_USE_RESULT static inline MaybeObject* MakeOrFindTwoCharacterString( |
+ uint32_t c1, |
+ uint32_t c2) { |
String* symbol; |
// Numeric strings have a different hash algorithm not known by |
// LookupTwoCharsSymbolIfExists, so we skip this step for such strings. |
@@ -2125,15 +2227,19 @@ |
// when building the new string. |
} else if ((c1 | c2) <= String::kMaxAsciiCharCodeU) { // We can do this |
ASSERT(IsPowerOf2(String::kMaxAsciiCharCodeU + 1)); // because of this. |
- Object* result = Heap::AllocateRawAsciiString(2); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Heap::AllocateRawAsciiString(2); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
char* dest = SeqAsciiString::cast(result)->GetChars(); |
dest[0] = c1; |
dest[1] = c2; |
return result; |
} else { |
- Object* result = Heap::AllocateRawTwoByteString(2); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Heap::AllocateRawTwoByteString(2); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
uc16* dest = SeqTwoByteString::cast(result)->GetChars(); |
dest[0] = c1; |
dest[1] = c2; |
@@ -2142,7 +2248,7 @@ |
} |
-Object* Heap::AllocateConsString(String* first, String* second) { |
+MaybeObject* Heap::AllocateConsString(String* first, String* second) { |
int first_length = first->length(); |
if (first_length == 0) { |
return second; |
@@ -2192,8 +2298,10 @@ |
ASSERT(first->IsFlat()); |
ASSERT(second->IsFlat()); |
if (is_ascii) { |
- Object* result = AllocateRawAsciiString(length); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawAsciiString(length); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Copy the characters into the new object. |
char* dest = SeqAsciiString::cast(result)->GetChars(); |
// Copy first part. |
@@ -2214,8 +2322,10 @@ |
return result; |
} else { |
if (is_ascii_data_in_two_byte_string) { |
- Object* result = AllocateRawAsciiString(length); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawAsciiString(length); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Copy the characters into the new object. |
char* dest = SeqAsciiString::cast(result)->GetChars(); |
String::WriteToFlat(first, dest, 0, first_length); |
@@ -2223,8 +2333,10 @@ |
return result; |
} |
- Object* result = AllocateRawTwoByteString(length); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawTwoByteString(length); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Copy the characters into the new object. |
uc16* dest = SeqTwoByteString::cast(result)->GetChars(); |
String::WriteToFlat(first, dest, 0, first_length); |
@@ -2236,8 +2348,10 @@ |
Map* map = (is_ascii || is_ascii_data_in_two_byte_string) ? |
cons_ascii_string_map() : cons_string_map(); |
- Object* result = Allocate(map, NEW_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Allocate(map, NEW_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
AssertNoAllocation no_gc; |
ConsString* cons_string = ConsString::cast(result); |
@@ -2250,7 +2364,7 @@ |
} |
-Object* Heap::AllocateSubString(String* buffer, |
+MaybeObject* Heap::AllocateSubString(String* buffer, |
int start, |
int end, |
PretenureFlag pretenure) { |
@@ -2271,10 +2385,12 @@ |
// Make an attempt to flatten the buffer to reduce access time. |
buffer = buffer->TryFlattenGetString(); |
- Object* result = buffer->IsAsciiRepresentation() |
- ? AllocateRawAsciiString(length, pretenure ) |
- : AllocateRawTwoByteString(length, pretenure); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = buffer->IsAsciiRepresentation() |
+ ? AllocateRawAsciiString(length, pretenure ) |
+ : AllocateRawTwoByteString(length, pretenure); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
String* string_result = String::cast(result); |
// Copy the characters into the new object. |
if (buffer->IsAsciiRepresentation()) { |
@@ -2291,7 +2407,7 @@ |
} |
-Object* Heap::AllocateExternalStringFromAscii( |
+MaybeObject* Heap::AllocateExternalStringFromAscii( |
ExternalAsciiString::Resource* resource) { |
size_t length = resource->length(); |
if (length > static_cast<size_t>(String::kMaxLength)) { |
@@ -2300,8 +2416,10 @@ |
} |
Map* map = external_ascii_string_map(); |
- Object* result = Allocate(map, NEW_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Allocate(map, NEW_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
ExternalAsciiString* external_string = ExternalAsciiString::cast(result); |
external_string->set_length(static_cast<int>(length)); |
@@ -2312,7 +2430,7 @@ |
} |
-Object* Heap::AllocateExternalStringFromTwoByte( |
+MaybeObject* Heap::AllocateExternalStringFromTwoByte( |
ExternalTwoByteString::Resource* resource) { |
size_t length = resource->length(); |
if (length > static_cast<size_t>(String::kMaxLength)) { |
@@ -2337,8 +2455,10 @@ |
Map* map = is_ascii ? |
Heap::external_string_with_ascii_data_map() : Heap::external_string_map(); |
- Object* result = Allocate(map, NEW_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Allocate(map, NEW_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
ExternalTwoByteString* external_string = ExternalTwoByteString::cast(result); |
external_string->set_length(static_cast<int>(length)); |
@@ -2349,29 +2469,32 @@ |
} |
-Object* Heap::LookupSingleCharacterStringFromCode(uint16_t code) { |
+MaybeObject* Heap::LookupSingleCharacterStringFromCode(uint16_t code) { |
if (code <= String::kMaxAsciiCharCode) { |
Object* value = Heap::single_character_string_cache()->get(code); |
if (value != Heap::undefined_value()) return value; |
char buffer[1]; |
buffer[0] = static_cast<char>(code); |
- Object* result = LookupSymbol(Vector<const char>(buffer, 1)); |
+ Object* result; |
+ MaybeObject* maybe_result = LookupSymbol(Vector<const char>(buffer, 1)); |
- if (result->IsFailure()) return result; |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
Heap::single_character_string_cache()->set(code, result); |
return result; |
} |
- Object* result = Heap::AllocateRawTwoByteString(1); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Heap::AllocateRawTwoByteString(1); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
String* answer = String::cast(result); |
answer->Set(0, code); |
return answer; |
} |
-Object* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
if (length < 0 || length > ByteArray::kMaxLength) { |
return Failure::OutOfMemoryException(); |
} |
@@ -2379,10 +2502,12 @@ |
return AllocateByteArray(length); |
} |
int size = ByteArray::SizeFor(length); |
- Object* result = (size <= MaxObjectSizeInPagedSpace()) |
- ? old_data_space_->AllocateRaw(size) |
- : lo_space_->AllocateRaw(size); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = (size <= MaxObjectSizeInPagedSpace()) |
+ ? old_data_space_->AllocateRaw(size) |
+ : lo_space_->AllocateRaw(size); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
reinterpret_cast<ByteArray*>(result)->set_map(byte_array_map()); |
reinterpret_cast<ByteArray*>(result)->set_length(length); |
@@ -2390,15 +2515,17 @@ |
} |
-Object* Heap::AllocateByteArray(int length) { |
+MaybeObject* Heap::AllocateByteArray(int length) { |
if (length < 0 || length > ByteArray::kMaxLength) { |
return Failure::OutOfMemoryException(); |
} |
int size = ByteArray::SizeFor(length); |
AllocationSpace space = |
(size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : NEW_SPACE; |
- Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
reinterpret_cast<ByteArray*>(result)->set_map(byte_array_map()); |
reinterpret_cast<ByteArray*>(result)->set_length(length); |
@@ -2420,12 +2547,15 @@ |
} |
-Object* Heap::AllocatePixelArray(int length, |
+MaybeObject* Heap::AllocatePixelArray(int length, |
uint8_t* external_pointer, |
PretenureFlag pretenure) { |
AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
- Object* result = AllocateRaw(PixelArray::kAlignedSize, space, OLD_DATA_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ AllocateRaw(PixelArray::kAlignedSize, space, OLD_DATA_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
reinterpret_cast<PixelArray*>(result)->set_map(pixel_array_map()); |
reinterpret_cast<PixelArray*>(result)->set_length(length); |
@@ -2435,15 +2565,17 @@ |
} |
-Object* Heap::AllocateExternalArray(int length, |
- ExternalArrayType array_type, |
- void* external_pointer, |
- PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateExternalArray(int length, |
+ ExternalArrayType array_type, |
+ void* external_pointer, |
+ PretenureFlag pretenure) { |
AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
- Object* result = AllocateRaw(ExternalArray::kAlignedSize, |
- space, |
- OLD_DATA_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRaw(ExternalArray::kAlignedSize, |
+ space, |
+ OLD_DATA_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
reinterpret_cast<ExternalArray*>(result)->set_map( |
MapForExternalArrayType(array_type)); |
@@ -2455,26 +2587,29 @@ |
} |
-Object* Heap::CreateCode(const CodeDesc& desc, |
- Code::Flags flags, |
- Handle<Object> self_reference) { |
+MaybeObject* Heap::CreateCode(const CodeDesc& desc, |
+ Code::Flags flags, |
+ Handle<Object> self_reference) { |
// Allocate ByteArray before the Code object, so that we do not risk |
// leaving uninitialized Code object (and breaking the heap). |
- Object* reloc_info = AllocateByteArray(desc.reloc_size, TENURED); |
- if (reloc_info->IsFailure()) return reloc_info; |
+ Object* reloc_info; |
+ { MaybeObject* maybe_reloc_info = AllocateByteArray(desc.reloc_size, TENURED); |
+ if (!maybe_reloc_info->ToObject(&reloc_info)) return maybe_reloc_info; |
+ } |
// Compute size |
int body_size = RoundUp(desc.instr_size, kObjectAlignment); |
int obj_size = Code::SizeFor(body_size); |
ASSERT(IsAligned(static_cast<intptr_t>(obj_size), kCodeAlignment)); |
- Object* result; |
+ MaybeObject* maybe_result; |
if (obj_size > MaxObjectSizeInPagedSpace()) { |
- result = lo_space_->AllocateRawCode(obj_size); |
+ maybe_result = lo_space_->AllocateRawCode(obj_size); |
} else { |
- result = code_space_->AllocateRaw(obj_size); |
+ maybe_result = code_space_->AllocateRaw(obj_size); |
} |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
// Initialize the object |
HeapObject::cast(result)->set_map(code_map()); |
@@ -2502,17 +2637,18 @@ |
} |
-Object* Heap::CopyCode(Code* code) { |
+MaybeObject* Heap::CopyCode(Code* code) { |
// Allocate an object the same size as the code object. |
int obj_size = code->Size(); |
- Object* result; |
+ MaybeObject* maybe_result; |
if (obj_size > MaxObjectSizeInPagedSpace()) { |
- result = lo_space_->AllocateRawCode(obj_size); |
+ maybe_result = lo_space_->AllocateRawCode(obj_size); |
} else { |
- result = code_space_->AllocateRaw(obj_size); |
+ maybe_result = code_space_->AllocateRaw(obj_size); |
} |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
// Copy code object. |
Address old_addr = code->address(); |
@@ -2526,11 +2662,16 @@ |
} |
-Object* Heap::CopyCode(Code* code, Vector<byte> reloc_info) { |
+MaybeObject* Heap::CopyCode(Code* code, Vector<byte> reloc_info) { |
// Allocate ByteArray before the Code object, so that we do not risk |
// leaving uninitialized Code object (and breaking the heap). |
- Object* reloc_info_array = AllocateByteArray(reloc_info.length(), TENURED); |
- if (reloc_info_array->IsFailure()) return reloc_info_array; |
+ Object* reloc_info_array; |
+ { MaybeObject* maybe_reloc_info_array = |
+ AllocateByteArray(reloc_info.length(), TENURED); |
+ if (!maybe_reloc_info_array->ToObject(&reloc_info_array)) { |
+ return maybe_reloc_info_array; |
+ } |
+ } |
int new_body_size = RoundUp(code->instruction_size(), kObjectAlignment); |
@@ -2541,14 +2682,15 @@ |
size_t relocation_offset = |
static_cast<size_t>(code->instruction_end() - old_addr); |
- Object* result; |
+ MaybeObject* maybe_result; |
if (new_obj_size > MaxObjectSizeInPagedSpace()) { |
- result = lo_space_->AllocateRawCode(new_obj_size); |
+ maybe_result = lo_space_->AllocateRawCode(new_obj_size); |
} else { |
- result = code_space_->AllocateRaw(new_obj_size); |
+ maybe_result = code_space_->AllocateRaw(new_obj_size); |
} |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
// Copy code object. |
Address new_addr = reinterpret_cast<HeapObject*>(result)->address(); |
@@ -2573,16 +2715,18 @@ |
} |
-Object* Heap::Allocate(Map* map, AllocationSpace space) { |
+MaybeObject* Heap::Allocate(Map* map, AllocationSpace space) { |
ASSERT(gc_state_ == NOT_IN_GC); |
ASSERT(map->instance_type() != MAP_TYPE); |
// If allocation failures are disallowed, we may allocate in a different |
// space when new space is full and the object is not a large object. |
AllocationSpace retry_space = |
(space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type()); |
- Object* result = |
- AllocateRaw(map->instance_size(), space, retry_space); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ AllocateRaw(map->instance_size(), space, retry_space); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
HeapObject::cast(result)->set_map(map); |
#ifdef ENABLE_LOGGING_AND_PROFILING |
ProducerHeapProfile::RecordJSObjectAllocation(result); |
@@ -2591,9 +2735,9 @@ |
} |
-Object* Heap::InitializeFunction(JSFunction* function, |
- SharedFunctionInfo* shared, |
- Object* prototype) { |
+MaybeObject* Heap::InitializeFunction(JSFunction* function, |
+ SharedFunctionInfo* shared, |
+ Object* prototype) { |
ASSERT(!prototype->IsMap()); |
function->initialize_properties(); |
function->initialize_elements(); |
@@ -2606,38 +2750,44 @@ |
} |
-Object* Heap::AllocateFunctionPrototype(JSFunction* function) { |
+MaybeObject* Heap::AllocateFunctionPrototype(JSFunction* function) { |
// Allocate the prototype. Make sure to use the object function |
// from the function's context, since the function can be from a |
// different context. |
JSFunction* object_function = |
function->context()->global_context()->object_function(); |
- Object* prototype = AllocateJSObject(object_function); |
- if (prototype->IsFailure()) return prototype; |
+ Object* prototype; |
+ { MaybeObject* maybe_prototype = AllocateJSObject(object_function); |
+ if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; |
+ } |
// When creating the prototype for the function we must set its |
// constructor to the function. |
- Object* result = |
- JSObject::cast(prototype)->SetProperty(constructor_symbol(), |
- function, |
- DONT_ENUM); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ JSObject::cast(prototype)->SetProperty(constructor_symbol(), |
+ function, |
+ DONT_ENUM); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
return prototype; |
} |
-Object* Heap::AllocateFunction(Map* function_map, |
- SharedFunctionInfo* shared, |
- Object* prototype, |
- PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateFunction(Map* function_map, |
+ SharedFunctionInfo* shared, |
+ Object* prototype, |
+ PretenureFlag pretenure) { |
AllocationSpace space = |
(pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; |
- Object* result = Allocate(function_map, space); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Allocate(function_map, space); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
return InitializeFunction(JSFunction::cast(result), shared, prototype); |
} |
-Object* Heap::AllocateArgumentsObject(Object* callee, int length) { |
+MaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) { |
// To get fast allocation and map sharing for arguments objects we |
// allocate them based on an arguments boilerplate. |
@@ -2654,9 +2804,11 @@ |
ASSERT(kArgumentsObjectSize == boilerplate->map()->instance_size()); |
// Do the allocation. |
- Object* result = |
- AllocateRaw(kArgumentsObjectSize, NEW_SPACE, OLD_POINTER_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ AllocateRaw(kArgumentsObjectSize, NEW_SPACE, OLD_POINTER_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Copy the content. The arguments boilerplate doesn't have any |
// fields that point to new space so it's safe to skip the write |
@@ -2694,23 +2846,27 @@ |
} |
-Object* Heap::AllocateInitialMap(JSFunction* fun) { |
+MaybeObject* Heap::AllocateInitialMap(JSFunction* fun) { |
ASSERT(!fun->has_initial_map()); |
// First create a new map with the size and number of in-object properties |
// suggested by the function. |
int instance_size = fun->shared()->CalculateInstanceSize(); |
int in_object_properties = fun->shared()->CalculateInObjectProperties(); |
- Object* map_obj = Heap::AllocateMap(JS_OBJECT_TYPE, instance_size); |
- if (map_obj->IsFailure()) return map_obj; |
+ Object* map_obj; |
+ { MaybeObject* maybe_map_obj = |
+ Heap::AllocateMap(JS_OBJECT_TYPE, instance_size); |
+ if (!maybe_map_obj->ToObject(&map_obj)) return maybe_map_obj; |
+ } |
// Fetch or allocate prototype. |
Object* prototype; |
if (fun->has_instance_prototype()) { |
prototype = fun->instance_prototype(); |
} else { |
- prototype = AllocateFunctionPrototype(fun); |
- if (prototype->IsFailure()) return prototype; |
+ { MaybeObject* maybe_prototype = AllocateFunctionPrototype(fun); |
+ if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; |
+ } |
} |
Map* map = Map::cast(map_obj); |
map->set_inobject_properties(in_object_properties); |
@@ -2730,8 +2886,12 @@ |
// Inline constructor can only handle inobject properties. |
fun->shared()->ForbidInlineConstructor(); |
} else { |
- Object* descriptors_obj = DescriptorArray::Allocate(count); |
- if (descriptors_obj->IsFailure()) return descriptors_obj; |
+ Object* descriptors_obj; |
+ { MaybeObject* maybe_descriptors_obj = DescriptorArray::Allocate(count); |
+ if (!maybe_descriptors_obj->ToObject(&descriptors_obj)) { |
+ return maybe_descriptors_obj; |
+ } |
+ } |
DescriptorArray* descriptors = DescriptorArray::cast(descriptors_obj); |
for (int i = 0; i < count; i++) { |
String* name = fun->shared()->GetThisPropertyAssignmentName(i); |
@@ -2792,7 +2952,7 @@ |
} |
-Object* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure) { |
// JSFunctions should be allocated using AllocateFunction to be |
// properly initialized. |
ASSERT(map->instance_type() != JS_FUNCTION_TYPE); |
@@ -2808,15 +2968,19 @@ |
map->unused_property_fields() - |
map->inobject_properties(); |
ASSERT(prop_size >= 0); |
- Object* properties = AllocateFixedArray(prop_size, pretenure); |
- if (properties->IsFailure()) return properties; |
+ Object* properties; |
+ { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, pretenure); |
+ if (!maybe_properties->ToObject(&properties)) return maybe_properties; |
+ } |
// Allocate the JSObject. |
AllocationSpace space = |
(pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; |
if (map->instance_size() > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
- Object* obj = Allocate(map, space); |
- if (obj->IsFailure()) return obj; |
+ Object* obj; |
+ { MaybeObject* maybe_obj = Allocate(map, space); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
// Initialize the JSObject. |
InitializeJSObjectFromMap(JSObject::cast(obj), |
@@ -2827,25 +2991,30 @@ |
} |
-Object* Heap::AllocateJSObject(JSFunction* constructor, |
- PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateJSObject(JSFunction* constructor, |
+ PretenureFlag pretenure) { |
// Allocate the initial map if absent. |
if (!constructor->has_initial_map()) { |
- Object* initial_map = AllocateInitialMap(constructor); |
- if (initial_map->IsFailure()) return initial_map; |
+ Object* initial_map; |
+ { MaybeObject* maybe_initial_map = AllocateInitialMap(constructor); |
+ if (!maybe_initial_map->ToObject(&initial_map)) return maybe_initial_map; |
+ } |
constructor->set_initial_map(Map::cast(initial_map)); |
Map::cast(initial_map)->set_constructor(constructor); |
} |
// Allocate the object based on the constructors initial map. |
- Object* result = |
+ MaybeObject* result = |
AllocateJSObjectFromMap(constructor->initial_map(), pretenure); |
+#ifdef DEBUG |
// Make sure result is NOT a global object if valid. |
- ASSERT(result->IsFailure() || !result->IsGlobalObject()); |
+ Object* non_failure; |
+ ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject()); |
+#endif |
return result; |
} |
-Object* Heap::AllocateGlobalObject(JSFunction* constructor) { |
+MaybeObject* Heap::AllocateGlobalObject(JSFunction* constructor) { |
ASSERT(constructor->has_initial_map()); |
Map* map = constructor->initial_map(); |
@@ -2865,10 +3034,12 @@ |
int initial_size = map->instance_type() == JS_GLOBAL_OBJECT_TYPE ? 64 : 512; |
// Allocate a dictionary object for backing storage. |
- Object* obj = |
- StringDictionary::Allocate( |
- map->NumberOfDescribedProperties() * 2 + initial_size); |
- if (obj->IsFailure()) return obj; |
+ Object* obj; |
+ { MaybeObject* maybe_obj = |
+ StringDictionary::Allocate( |
+ map->NumberOfDescribedProperties() * 2 + initial_size); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
StringDictionary* dictionary = StringDictionary::cast(obj); |
// The global object might be created from an object template with accessors. |
@@ -2880,23 +3051,28 @@ |
PropertyDetails d = |
PropertyDetails(details.attributes(), CALLBACKS, details.index()); |
Object* value = descs->GetCallbacksObject(i); |
- value = Heap::AllocateJSGlobalPropertyCell(value); |
- if (value->IsFailure()) return value; |
+ { MaybeObject* maybe_value = Heap::AllocateJSGlobalPropertyCell(value); |
+ if (!maybe_value->ToObject(&value)) return maybe_value; |
+ } |
- Object* result = dictionary->Add(descs->GetKey(i), value, d); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = dictionary->Add(descs->GetKey(i), value, d); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
dictionary = StringDictionary::cast(result); |
} |
// Allocate the global object and initialize it with the backing store. |
- obj = Allocate(map, OLD_POINTER_SPACE); |
- if (obj->IsFailure()) return obj; |
+ { MaybeObject* maybe_obj = Allocate(map, OLD_POINTER_SPACE); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
JSObject* global = JSObject::cast(obj); |
InitializeJSObjectFromMap(global, dictionary, map); |
// Create a new map for the global object. |
- obj = map->CopyDropDescriptors(); |
- if (obj->IsFailure()) return obj; |
+ { MaybeObject* maybe_obj = map->CopyDropDescriptors(); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
Map* new_map = Map::cast(obj); |
// Setup the global object as a normalized object. |
@@ -2911,7 +3087,7 @@ |
} |
-Object* Heap::CopyJSObject(JSObject* source) { |
+MaybeObject* Heap::CopyJSObject(JSObject* source) { |
// Never used to copy functions. If functions need to be copied we |
// have to be careful to clear the literals array. |
ASSERT(!source->IsJSFunction()); |
@@ -2924,8 +3100,10 @@ |
// 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()) { |
- clone = AllocateRaw(object_size, NEW_SPACE, OLD_POINTER_SPACE); |
- if (clone->IsFailure()) return clone; |
+ { MaybeObject* maybe_clone = |
+ AllocateRaw(object_size, NEW_SPACE, OLD_POINTER_SPACE); |
+ if (!maybe_clone->ToObject(&clone)) return maybe_clone; |
+ } |
Address clone_address = HeapObject::cast(clone)->address(); |
CopyBlock(clone_address, |
source->address(), |
@@ -2935,8 +3113,9 @@ |
JSObject::kHeaderSize, |
(object_size - JSObject::kHeaderSize) / kPointerSize); |
} else { |
- clone = new_space_.AllocateRaw(object_size); |
- if (clone->IsFailure()) return clone; |
+ { MaybeObject* maybe_clone = new_space_.AllocateRaw(object_size); |
+ if (!maybe_clone->ToObject(&clone)) return maybe_clone; |
+ } |
ASSERT(Heap::InNewSpace(clone)); |
// Since we know the clone is allocated in new space, we can copy |
// the contents without worrying about updating the write barrier. |
@@ -2949,16 +3128,20 @@ |
FixedArray* properties = FixedArray::cast(source->properties()); |
// Update elements if necessary. |
if (elements->length() > 0) { |
- Object* elem = |
- (elements->map() == fixed_cow_array_map()) ? |
- elements : CopyFixedArray(elements); |
- if (elem->IsFailure()) return elem; |
+ Object* elem; |
+ { MaybeObject* maybe_elem = |
+ (elements->map() == fixed_cow_array_map()) ? |
+ elements : CopyFixedArray(elements); |
+ if (!maybe_elem->ToObject(&elem)) return maybe_elem; |
+ } |
JSObject::cast(clone)->set_elements(FixedArray::cast(elem)); |
} |
// Update properties if necessary. |
if (properties->length() > 0) { |
- Object* prop = CopyFixedArray(properties); |
- if (prop->IsFailure()) return prop; |
+ Object* prop; |
+ { MaybeObject* maybe_prop = CopyFixedArray(properties); |
+ if (!maybe_prop->ToObject(&prop)) return maybe_prop; |
+ } |
JSObject::cast(clone)->set_properties(FixedArray::cast(prop)); |
} |
// Return the new clone. |
@@ -2969,8 +3152,8 @@ |
} |
-Object* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor, |
- JSGlobalProxy* object) { |
+MaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor, |
+ JSGlobalProxy* object) { |
ASSERT(constructor->has_initial_map()); |
Map* map = constructor->initial_map(); |
@@ -2981,8 +3164,10 @@ |
// Allocate the backing storage for the properties. |
int prop_size = map->unused_property_fields() - map->inobject_properties(); |
- Object* properties = AllocateFixedArray(prop_size, TENURED); |
- if (properties->IsFailure()) return properties; |
+ Object* properties; |
+ { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, TENURED); |
+ if (!maybe_properties->ToObject(&properties)) return maybe_properties; |
+ } |
// Reset the map for the object. |
object->set_map(constructor->initial_map()); |
@@ -2993,10 +3178,13 @@ |
} |
-Object* Heap::AllocateStringFromAscii(Vector<const char> string, |
- PretenureFlag pretenure) { |
- Object* result = AllocateRawAsciiString(string.length(), pretenure); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateStringFromAscii(Vector<const char> string, |
+ PretenureFlag pretenure) { |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ AllocateRawAsciiString(string.length(), pretenure); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Copy the characters into the new object. |
SeqAsciiString* string_result = SeqAsciiString::cast(result); |
@@ -3007,8 +3195,8 @@ |
} |
-Object* Heap::AllocateStringFromUtf8(Vector<const char> string, |
- PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateStringFromUtf8(Vector<const char> string, |
+ PretenureFlag pretenure) { |
// V8 only supports characters in the Basic Multilingual Plane. |
const uc32 kMaxSupportedChar = 0xFFFF; |
// Count the number of characters in the UTF-8 string and check if |
@@ -3027,8 +3215,10 @@ |
// since UTF8 is backwards compatible with ascii. |
if (is_ascii) return AllocateStringFromAscii(string, pretenure); |
- Object* result = AllocateRawTwoByteString(chars, pretenure); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawTwoByteString(chars, pretenure); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Convert and copy the characters into the new object. |
String* string_result = String::cast(result); |
@@ -3042,19 +3232,20 @@ |
} |
-Object* Heap::AllocateStringFromTwoByte(Vector<const uc16> string, |
- PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateStringFromTwoByte(Vector<const uc16> string, |
+ PretenureFlag pretenure) { |
// Check if the string is an ASCII string. |
int i = 0; |
while (i < string.length() && string[i] <= String::kMaxAsciiCharCode) i++; |
- Object* result; |
+ MaybeObject* maybe_result; |
if (i == string.length()) { // It's an ASCII string. |
- result = AllocateRawAsciiString(string.length(), pretenure); |
+ maybe_result = AllocateRawAsciiString(string.length(), pretenure); |
} else { // It's not an ASCII string. |
- result = AllocateRawTwoByteString(string.length(), pretenure); |
+ maybe_result = AllocateRawTwoByteString(string.length(), pretenure); |
} |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
// Copy the characters into the new object, which may be either ASCII or |
// UTF-16. |
@@ -3087,9 +3278,9 @@ |
} |
-Object* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, |
- int chars, |
- uint32_t hash_field) { |
+MaybeObject* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, |
+ int chars, |
+ uint32_t hash_field) { |
ASSERT(chars >= 0); |
// Ensure the chars matches the number of characters in the buffer. |
ASSERT(static_cast<unsigned>(chars) == buffer->Length()); |
@@ -3122,10 +3313,12 @@ |
} |
// Allocate string. |
- Object* result = (size > MaxObjectSizeInPagedSpace()) |
- ? lo_space_->AllocateRaw(size) |
- : old_data_space_->AllocateRaw(size); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = (size > MaxObjectSizeInPagedSpace()) |
+ ? lo_space_->AllocateRaw(size) |
+ : old_data_space_->AllocateRaw(size); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
reinterpret_cast<HeapObject*>(result)->set_map(map); |
// Set length and hash fields of the allocated string. |
@@ -3143,7 +3336,7 @@ |
} |
-Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
if (length < 0 || length > SeqAsciiString::kMaxLength) { |
return Failure::OutOfMemoryException(); |
} |
@@ -3165,8 +3358,10 @@ |
} else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) { |
space = LO_SPACE; |
} |
- Object* result = AllocateRaw(size, space, retry_space); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Partially initialize the object. |
HeapObject::cast(result)->set_map(ascii_string_map()); |
@@ -3177,7 +3372,8 @@ |
} |
-Object* Heap::AllocateRawTwoByteString(int length, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateRawTwoByteString(int length, |
+ PretenureFlag pretenure) { |
if (length < 0 || length > SeqTwoByteString::kMaxLength) { |
return Failure::OutOfMemoryException(); |
} |
@@ -3197,8 +3393,10 @@ |
} else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) { |
space = LO_SPACE; |
} |
- Object* result = AllocateRaw(size, space, retry_space); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Partially initialize the object. |
HeapObject::cast(result)->set_map(string_map()); |
@@ -3209,10 +3407,13 @@ |
} |
-Object* Heap::AllocateEmptyFixedArray() { |
+MaybeObject* Heap::AllocateEmptyFixedArray() { |
int size = FixedArray::SizeFor(0); |
- Object* result = AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
// Initialize the object. |
reinterpret_cast<FixedArray*>(result)->set_map(fixed_array_map()); |
reinterpret_cast<FixedArray*>(result)->set_length(0); |
@@ -3220,7 +3421,7 @@ |
} |
-Object* Heap::AllocateRawFixedArray(int length) { |
+MaybeObject* Heap::AllocateRawFixedArray(int length) { |
if (length < 0 || length > FixedArray::kMaxLength) { |
return Failure::OutOfMemoryException(); |
} |
@@ -3235,10 +3436,12 @@ |
} |
-Object* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { |
+MaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { |
int len = src->length(); |
- Object* obj = AllocateRawFixedArray(len); |
- if (obj->IsFailure()) return obj; |
+ Object* obj; |
+ { MaybeObject* maybe_obj = AllocateRawFixedArray(len); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
if (Heap::InNewSpace(obj)) { |
HeapObject* dst = HeapObject::cast(obj); |
dst->set_map(map); |
@@ -3259,24 +3462,25 @@ |
} |
-Object* Heap::AllocateFixedArray(int length) { |
+MaybeObject* Heap::AllocateFixedArray(int length) { |
ASSERT(length >= 0); |
if (length == 0) return empty_fixed_array(); |
- Object* result = AllocateRawFixedArray(length); |
- if (!result->IsFailure()) { |
- // Initialize header. |
- FixedArray* array = reinterpret_cast<FixedArray*>(result); |
- array->set_map(fixed_array_map()); |
- array->set_length(length); |
- // Initialize body. |
- ASSERT(!Heap::InNewSpace(undefined_value())); |
- MemsetPointer(array->data_start(), undefined_value(), length); |
+ Object* result; |
+ { MaybeObject* maybe_result = AllocateRawFixedArray(length); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
} |
+ // Initialize header. |
+ FixedArray* array = reinterpret_cast<FixedArray*>(result); |
+ array->set_map(fixed_array_map()); |
+ array->set_length(length); |
+ // Initialize body. |
+ ASSERT(!Heap::InNewSpace(undefined_value())); |
+ MemsetPointer(array->data_start(), undefined_value(), length); |
return result; |
} |
-Object* Heap::AllocateRawFixedArray(int length, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateRawFixedArray(int length, PretenureFlag pretenure) { |
if (length < 0 || length > FixedArray::kMaxLength) { |
return Failure::OutOfMemoryException(); |
} |
@@ -3300,16 +3504,19 @@ |
} |
-static Object* AllocateFixedArrayWithFiller(int length, |
- PretenureFlag pretenure, |
- Object* filler) { |
+MUST_USE_RESULT static MaybeObject* AllocateFixedArrayWithFiller( |
+ int length, |
+ PretenureFlag pretenure, |
+ Object* filler) { |
ASSERT(length >= 0); |
ASSERT(Heap::empty_fixed_array()->IsFixedArray()); |
if (length == 0) return Heap::empty_fixed_array(); |
ASSERT(!Heap::InNewSpace(filler)); |
- Object* result = Heap::AllocateRawFixedArray(length, pretenure); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Heap::AllocateRawFixedArray(length, pretenure); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
HeapObject::cast(result)->set_map(Heap::fixed_array_map()); |
FixedArray* array = FixedArray::cast(result); |
@@ -3319,21 +3526,24 @@ |
} |
-Object* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { |
return AllocateFixedArrayWithFiller(length, pretenure, undefined_value()); |
} |
-Object* Heap::AllocateFixedArrayWithHoles(int length, PretenureFlag pretenure) { |
+MaybeObject* Heap::AllocateFixedArrayWithHoles(int length, |
+ PretenureFlag pretenure) { |
return AllocateFixedArrayWithFiller(length, pretenure, the_hole_value()); |
} |
-Object* Heap::AllocateUninitializedFixedArray(int length) { |
+MaybeObject* Heap::AllocateUninitializedFixedArray(int length) { |
if (length == 0) return empty_fixed_array(); |
- Object* obj = AllocateRawFixedArray(length); |
- if (obj->IsFailure()) return obj; |
+ Object* obj; |
+ { MaybeObject* maybe_obj = AllocateRawFixedArray(length); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
reinterpret_cast<FixedArray*>(obj)->set_map(fixed_array_map()); |
FixedArray::cast(obj)->set_length(length); |
@@ -3341,18 +3551,23 @@ |
} |
-Object* Heap::AllocateHashTable(int length, PretenureFlag pretenure) { |
- Object* result = Heap::AllocateFixedArray(length, pretenure); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateHashTable(int length, PretenureFlag pretenure) { |
+ Object* result; |
+ { MaybeObject* maybe_result = Heap::AllocateFixedArray(length, pretenure); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
reinterpret_cast<HeapObject*>(result)->set_map(hash_table_map()); |
ASSERT(result->IsHashTable()); |
return result; |
} |
-Object* Heap::AllocateGlobalContext() { |
- Object* result = Heap::AllocateFixedArray(Context::GLOBAL_CONTEXT_SLOTS); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateGlobalContext() { |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ Heap::AllocateFixedArray(Context::GLOBAL_CONTEXT_SLOTS); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
Context* context = reinterpret_cast<Context*>(result); |
context->set_map(global_context_map()); |
ASSERT(context->IsGlobalContext()); |
@@ -3361,10 +3576,12 @@ |
} |
-Object* Heap::AllocateFunctionContext(int length, JSFunction* function) { |
+MaybeObject* Heap::AllocateFunctionContext(int length, JSFunction* function) { |
ASSERT(length >= Context::MIN_CONTEXT_SLOTS); |
- Object* result = Heap::AllocateFixedArray(length); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Heap::AllocateFixedArray(length); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
Context* context = reinterpret_cast<Context*>(result); |
context->set_map(context_map()); |
context->set_closure(function); |
@@ -3379,11 +3596,14 @@ |
} |
-Object* Heap::AllocateWithContext(Context* previous, |
- JSObject* extension, |
- bool is_catch_context) { |
- Object* result = Heap::AllocateFixedArray(Context::MIN_CONTEXT_SLOTS); |
- if (result->IsFailure()) return result; |
+MaybeObject* Heap::AllocateWithContext(Context* previous, |
+ JSObject* extension, |
+ bool is_catch_context) { |
+ Object* result; |
+ { MaybeObject* maybe_result = |
+ Heap::AllocateFixedArray(Context::MIN_CONTEXT_SLOTS); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
Context* context = reinterpret_cast<Context*>(result); |
context->set_map(is_catch_context ? catch_context_map() : context_map()); |
context->set_closure(previous->closure()); |
@@ -3398,7 +3618,7 @@ |
} |
-Object* Heap::AllocateStruct(InstanceType type) { |
+MaybeObject* Heap::AllocateStruct(InstanceType type) { |
Map* map; |
switch (type) { |
#define MAKE_CASE(NAME, Name, name) case NAME##_TYPE: map = name##_map(); break; |
@@ -3411,8 +3631,10 @@ |
int size = map->instance_size(); |
AllocationSpace space = |
(size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : OLD_POINTER_SPACE; |
- Object* result = Heap::Allocate(map, space); |
- if (result->IsFailure()) return result; |
+ Object* result; |
+ { MaybeObject* maybe_result = Heap::Allocate(map, space); |
+ if (!maybe_result->ToObject(&result)) return maybe_result; |
+ } |
Struct::cast(result)->InitializeBody(size); |
return result; |
} |
@@ -3672,10 +3894,13 @@ |
#endif // DEBUG |
-Object* Heap::LookupSymbol(Vector<const char> string) { |
+MaybeObject* Heap::LookupSymbol(Vector<const char> string) { |
Object* symbol = NULL; |
- Object* new_table = symbol_table()->LookupSymbol(string, &symbol); |
- if (new_table->IsFailure()) return new_table; |
+ Object* new_table; |
+ { MaybeObject* maybe_new_table = |
+ symbol_table()->LookupSymbol(string, &symbol); |
+ if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; |
+ } |
// Can't use set_symbol_table because SymbolTable::cast knows that |
// SymbolTable is a singleton and checks for identity. |
roots_[kSymbolTableRootIndex] = new_table; |
@@ -3684,11 +3909,14 @@ |
} |
-Object* Heap::LookupSymbol(String* string) { |
+MaybeObject* Heap::LookupSymbol(String* string) { |
if (string->IsSymbol()) return string; |
Object* symbol = NULL; |
- Object* new_table = symbol_table()->LookupString(string, &symbol); |
- if (new_table->IsFailure()) return new_table; |
+ Object* new_table; |
+ { MaybeObject* maybe_new_table = |
+ symbol_table()->LookupString(string, &symbol); |
+ if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; |
+ } |
// Can't use set_symbol_table because SymbolTable::cast knows that |
// SymbolTable is a singleton and checks for identity. |
roots_[kSymbolTableRootIndex] = new_table; |