Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index 33606e15afcaaa126897eb73bba19fdaaaf55825..426dfaaf750ee50867755a16065508956ee28956 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -1795,6 +1795,12 @@ bool Heap::CreateInitialMaps() { |
Map::cast(obj)->set_is_undetectable(); |
{ MaybeObject* maybe_obj = |
+ AllocateMap(FIXED_DOUBLE_ARRAY_TYPE, kVariableSizeSentinel); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
+ set_fixed_double_array_map(Map::cast(obj)); |
+ |
+ { MaybeObject* maybe_obj = |
AllocateMap(BYTE_ARRAY_TYPE, kVariableSizeSentinel); |
if (!maybe_obj->ToObject(&obj)) return false; |
} |
@@ -3835,6 +3841,62 @@ MaybeObject* Heap::AllocateUninitializedFixedArray(int length) { |
} |
+MaybeObject* Heap::AllocateEmptyFixedDoubleArray() { |
+ int size = FixedDoubleArray::SizeFor(0); |
+ 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<FixedDoubleArray*>(result)->set_map( |
+ fixed_double_array_map()); |
+ reinterpret_cast<FixedDoubleArray*>(result)->set_length(0); |
+ return result; |
+} |
+ |
+ |
+MaybeObject* Heap::AllocateUninitializedFixedDoubleArray( |
+ int length, |
+ PretenureFlag pretenure) { |
+ if (length == 0) return empty_fixed_double_array(); |
+ |
+ Object* obj; |
+ { MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(length, pretenure); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
+ |
+ reinterpret_cast<FixedDoubleArray*>(obj)->set_map(fixed_double_array_map()); |
+ FixedDoubleArray::cast(obj)->set_length(length); |
+ return obj; |
+} |
+ |
+ |
+MaybeObject* Heap::AllocateRawFixedDoubleArray(int length, |
+ PretenureFlag pretenure) { |
+ if (length < 0 || length > FixedDoubleArray::kMaxLength) { |
+ return Failure::OutOfMemoryException(); |
+ } |
+ |
+ AllocationSpace space = |
+ (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
+ int size = FixedDoubleArray::SizeFor(length); |
+ if (space == NEW_SPACE && size > kMaxObjectSizeInNewSpace) { |
+ // Too big for new space. |
+ space = LO_SPACE; |
+ } else if (space == OLD_DATA_SPACE && |
+ size > MaxObjectSizeInPagedSpace()) { |
+ // Too big for old data space. |
+ space = LO_SPACE; |
+ } |
+ |
+ AllocationSpace retry_space = |
+ (size <= MaxObjectSizeInPagedSpace()) ? OLD_DATA_SPACE : LO_SPACE; |
+ |
+ return AllocateRaw(size, space, retry_space); |
+} |
+ |
+ |
MaybeObject* Heap::AllocateHashTable(int length, PretenureFlag pretenure) { |
Object* result; |
{ MaybeObject* maybe_result = AllocateFixedArray(length, pretenure); |