Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index 33606e15afcaaa126897eb73bba19fdaaaf55825..3cb0219bcbdc981a244cda943b8b82537aee39c9 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -1309,6 +1309,7 @@ class ScavengingVisitor : public StaticVisitorBase { |
table_.Register(kVisitShortcutCandidate, &EvacuateShortcutCandidate); |
table_.Register(kVisitByteArray, &EvacuateByteArray); |
table_.Register(kVisitFixedArray, &EvacuateFixedArray); |
+ table_.Register(kVisitFixedDoubleArray, &EvacuateFixedDoubleArray); |
table_.Register(kVisitGlobalContext, |
&ObjectEvacuationStrategy<POINTER_OBJECT>:: |
@@ -1456,6 +1457,18 @@ class ScavengingVisitor : public StaticVisitorBase { |
} |
+ static inline void EvacuateFixedDoubleArray(Map* map, |
+ HeapObject** slot, |
+ HeapObject* object) { |
+ int length = reinterpret_cast<FixedDoubleArray*>(object)->length(); |
+ int object_size = FixedDoubleArray::SizeFor(length); |
+ EvacuateObject<DATA_OBJECT, UNKNOWN_SIZE>(map, |
+ slot, |
+ object, |
+ object_size); |
+ } |
+ |
+ |
static inline void EvacuateByteArray(Map* map, |
HeapObject** slot, |
HeapObject* object) { |
@@ -1795,6 +1808,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 +3854,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); |