Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index bc55f9e1c5f8fb88a9a3db623d2dba0efd3bc2d9..705fdd10a415de7d1d10f29cab803714351f0da4 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -495,11 +495,11 @@ void Heap::ClearAllICsByKind(Code::Kind kind) { |
} |
-void Heap::RepairFreeListsAfterBoot() { |
+void Heap::RepairFreeListsAfterDeserialization() { |
PagedSpaces spaces(this); |
for (PagedSpace* space = spaces.next(); space != NULL; |
space = spaces.next()) { |
- space->RepairFreeListsAfterBoot(); |
+ space->RepairFreeListsAfterDeserialization(); |
} |
} |
@@ -952,14 +952,15 @@ bool Heap::ReserveSpace(Reservation* reservations) { |
} else { |
allocation = paged_space(space)->AllocateRaw(size); |
} |
- FreeListNode* node; |
- if (allocation.To(&node)) { |
+ HeapObject* free_space; |
+ if (allocation.To(&free_space)) { |
// Mark with a free list node, in case we have a GC before |
// deserializing. |
- node->set_size(this, size); |
+ Address free_space_address = free_space->address(); |
+ CreateFillerObjectAt(free_space_address, size); |
DCHECK(space < Serializer::kNumberOfPreallocatedSpaces); |
- chunk.start = node->address(); |
- chunk.end = node->address() + size; |
+ chunk.start = free_space_address; |
+ chunk.end = free_space_address + size; |
} else { |
perform_gc = true; |
break; |
@@ -3392,12 +3393,17 @@ AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
void Heap::CreateFillerObjectAt(Address addr, int size) { |
if (size == 0) return; |
HeapObject* filler = HeapObject::FromAddress(addr); |
+ // At this point, we may be deserializing the heap from a snapshot, and |
+ // none of the maps have been created yet and are NULL. |
if (size == kPointerSize) { |
- filler->set_map_no_write_barrier(one_pointer_filler_map()); |
+ filler->set_map_no_write_barrier(raw_unchecked_one_pointer_filler_map()); |
+ DCHECK(filler->map() == NULL || filler->map() == one_pointer_filler_map()); |
} else if (size == 2 * kPointerSize) { |
- filler->set_map_no_write_barrier(two_pointer_filler_map()); |
+ filler->set_map_no_write_barrier(raw_unchecked_two_pointer_filler_map()); |
+ DCHECK(filler->map() == NULL || filler->map() == two_pointer_filler_map()); |
} else { |
- filler->set_map_no_write_barrier(free_space_map()); |
+ filler->set_map_no_write_barrier(raw_unchecked_free_space_map()); |
+ DCHECK(filler->map() == NULL || filler->map() == free_space_map()); |
FreeSpace::cast(filler)->set_size(size); |
} |
} |