Index: src/spaces.cc |
diff --git a/src/spaces.cc b/src/spaces.cc |
index 11fb4ad557166a762245f6ef3be4ca3e4030a827..ca76189ece8831af595fc469ba3f809eeb65cf28 100644 |
--- a/src/spaces.cc |
+++ b/src/spaces.cc |
@@ -1740,7 +1740,7 @@ void NewSpace::RecordPromotion(HeapObject* obj) { |
// ----------------------------------------------------------------------------- |
// Free lists for old object spaces implementation |
-void FreeListNode::set_size(int size_in_bytes) { |
+void FreeListNode::set_size(Heap* heap, int size_in_bytes) { |
ASSERT(size_in_bytes > 0); |
ASSERT(IsAligned(size_in_bytes, kPointerSize)); |
@@ -1752,14 +1752,14 @@ void FreeListNode::set_size(int size_in_bytes) { |
// field and a next pointer, we give it a filler map that gives it the |
// correct size. |
if (size_in_bytes > ByteArray::kHeaderSize) { |
- set_map(HEAP->raw_unchecked_byte_array_map()); |
+ set_map(heap->raw_unchecked_byte_array_map()); |
// Can't use ByteArray::cast because it fails during deserialization. |
ByteArray* this_as_byte_array = reinterpret_cast<ByteArray*>(this); |
this_as_byte_array->set_length(ByteArray::LengthFor(size_in_bytes)); |
} else if (size_in_bytes == kPointerSize) { |
- set_map(HEAP->raw_unchecked_one_pointer_filler_map()); |
+ set_map(heap->raw_unchecked_one_pointer_filler_map()); |
} else if (size_in_bytes == 2 * kPointerSize) { |
- set_map(HEAP->raw_unchecked_two_pointer_filler_map()); |
+ set_map(heap->raw_unchecked_two_pointer_filler_map()); |
} else { |
UNREACHABLE(); |
} |
@@ -1768,9 +1768,9 @@ void FreeListNode::set_size(int size_in_bytes) { |
} |
-Address FreeListNode::next() { |
+Address FreeListNode::next(Heap* heap) { |
ASSERT(IsFreeListNode(this)); |
- if (map() == HEAP->raw_unchecked_byte_array_map()) { |
+ if (map() == heap->raw_unchecked_byte_array_map()) { |
ASSERT(Size() >= kNextOffset + kPointerSize); |
return Memory::Address_at(address() + kNextOffset); |
} else { |
@@ -1779,9 +1779,9 @@ Address FreeListNode::next() { |
} |
-void FreeListNode::set_next(Address next) { |
+void FreeListNode::set_next(Heap* heap, Address next) { |
ASSERT(IsFreeListNode(this)); |
- if (map() == HEAP->raw_unchecked_byte_array_map()) { |
+ if (map() == heap->raw_unchecked_byte_array_map()) { |
ASSERT(Size() >= kNextOffset + kPointerSize); |
Memory::Address_at(address() + kNextOffset) = next; |
} else { |
@@ -1790,7 +1790,9 @@ void FreeListNode::set_next(Address next) { |
} |
-OldSpaceFreeList::OldSpaceFreeList(AllocationSpace owner) : owner_(owner) { |
+OldSpaceFreeList::OldSpaceFreeList(Heap* heap, AllocationSpace owner) |
+ : heap_(heap), |
+ owner_(owner) { |
Reset(); |
} |
@@ -1825,7 +1827,7 @@ int OldSpaceFreeList::Free(Address start, int size_in_bytes) { |
Isolate::Current()->memory_allocator()->ZapBlock(start, size_in_bytes); |
#endif |
FreeListNode* node = FreeListNode::FromAddress(start); |
- node->set_size(size_in_bytes); |
+ node->set_size(heap_, size_in_bytes); |
// We don't use the freelists in compacting mode. This makes it more like a |
// GC that only has mark-sweep-compact and doesn't have a mark-sweep |
@@ -1843,7 +1845,7 @@ int OldSpaceFreeList::Free(Address start, int size_in_bytes) { |
// Insert other blocks at the head of an exact free list. |
int index = size_in_bytes >> kPointerSizeLog2; |
- node->set_next(free_[index].head_node_); |
+ node->set_next(heap_, free_[index].head_node_); |
free_[index].head_node_ = node->address(); |
available_ += size_in_bytes; |
needs_rebuild_ = true; |
@@ -1862,7 +1864,8 @@ MaybeObject* OldSpaceFreeList::Allocate(int size_in_bytes, int* wasted_bytes) { |
if (free_[index].head_node_ != NULL) { |
FreeListNode* node = FreeListNode::FromAddress(free_[index].head_node_); |
// If this was the last block of its size, remove the size. |
- if ((free_[index].head_node_ = node->next()) == NULL) RemoveSize(index); |
+ if ((free_[index].head_node_ = node->next(heap_)) == NULL) |
+ RemoveSize(index); |
available_ -= size_in_bytes; |
*wasted_bytes = 0; |
ASSERT(!FLAG_always_compact); // We only use the freelists with mark-sweep. |
@@ -1891,33 +1894,33 @@ MaybeObject* OldSpaceFreeList::Allocate(int size_in_bytes, int* wasted_bytes) { |
finger_ = prev; |
free_[prev].next_size_ = rem; |
// If this was the last block of size cur, remove the size. |
- if ((free_[cur].head_node_ = cur_node->next()) == NULL) { |
+ if ((free_[cur].head_node_ = cur_node->next(heap_)) == NULL) { |
free_[rem].next_size_ = free_[cur].next_size_; |
} else { |
free_[rem].next_size_ = cur; |
} |
// Add the remainder block. |
- rem_node->set_size(rem_bytes); |
- rem_node->set_next(free_[rem].head_node_); |
+ rem_node->set_size(heap_, rem_bytes); |
+ rem_node->set_next(heap_, free_[rem].head_node_); |
free_[rem].head_node_ = rem_node->address(); |
} else { |
// If this was the last block of size cur, remove the size. |
- if ((free_[cur].head_node_ = cur_node->next()) == NULL) { |
+ if ((free_[cur].head_node_ = cur_node->next(heap_)) == NULL) { |
finger_ = prev; |
free_[prev].next_size_ = free_[cur].next_size_; |
} |
if (rem_bytes < kMinBlockSize) { |
// Too-small remainder is wasted. |
- rem_node->set_size(rem_bytes); |
+ rem_node->set_size(heap_, rem_bytes); |
available_ -= size_in_bytes + rem_bytes; |
*wasted_bytes = rem_bytes; |
return cur_node; |
} |
// Add the remainder block and, if needed, insert its size. |
- rem_node->set_size(rem_bytes); |
- rem_node->set_next(free_[rem].head_node_); |
+ rem_node->set_size(heap_, rem_bytes); |
+ rem_node->set_next(heap_, free_[rem].head_node_); |
free_[rem].head_node_ = rem_node->address(); |
- if (rem_node->next() == NULL) InsertSize(rem); |
+ if (rem_node->next(heap_) == NULL) InsertSize(rem); |
} |
available_ -= size_in_bytes; |
*wasted_bytes = 0; |
@@ -1930,7 +1933,7 @@ void OldSpaceFreeList::MarkNodes() { |
Address cur_addr = free_[i].head_node_; |
while (cur_addr != NULL) { |
FreeListNode* cur_node = FreeListNode::FromAddress(cur_addr); |
- cur_addr = cur_node->next(); |
+ cur_addr = cur_node->next(heap_); |
cur_node->SetMark(); |
} |
} |
@@ -1944,7 +1947,7 @@ bool OldSpaceFreeList::Contains(FreeListNode* node) { |
while (cur_addr != NULL) { |
FreeListNode* cur_node = FreeListNode::FromAddress(cur_addr); |
if (cur_node == node) return true; |
- cur_addr = cur_node->next(); |
+ cur_addr = cur_node->next(heap_); |
} |
} |
return false; |
@@ -1952,8 +1955,10 @@ bool OldSpaceFreeList::Contains(FreeListNode* node) { |
#endif |
-FixedSizeFreeList::FixedSizeFreeList(AllocationSpace owner, int object_size) |
- : owner_(owner), object_size_(object_size) { |
+FixedSizeFreeList::FixedSizeFreeList(Heap* heap, |
+ AllocationSpace owner, |
+ int object_size) |
+ : heap_(heap), owner_(owner), object_size_(object_size) { |
Reset(); |
} |
@@ -1971,12 +1976,12 @@ void FixedSizeFreeList::Free(Address start) { |
// We only use the freelists with mark-sweep. |
ASSERT(!HEAP->mark_compact_collector()->IsCompacting()); |
FreeListNode* node = FreeListNode::FromAddress(start); |
- node->set_size(object_size_); |
- node->set_next(NULL); |
+ node->set_size(heap_, object_size_); |
+ node->set_next(heap_, NULL); |
if (head_ == NULL) { |
tail_ = head_ = node->address(); |
} else { |
- FreeListNode::FromAddress(tail_)->set_next(node->address()); |
+ FreeListNode::FromAddress(tail_)->set_next(heap_, node->address()); |
tail_ = node->address(); |
} |
available_ += object_size_; |
@@ -1990,7 +1995,7 @@ MaybeObject* FixedSizeFreeList::Allocate() { |
ASSERT(!FLAG_always_compact); // We only use the freelists with mark-sweep. |
FreeListNode* node = FreeListNode::FromAddress(head_); |
- head_ = node->next(); |
+ head_ = node->next(heap_); |
available_ -= object_size_; |
return node; |
} |
@@ -2000,7 +2005,7 @@ void FixedSizeFreeList::MarkNodes() { |
Address cur_addr = head_; |
while (cur_addr != NULL && cur_addr != tail_) { |
FreeListNode* cur_node = FreeListNode::FromAddress(cur_addr); |
- cur_addr = cur_node->next(); |
+ cur_addr = cur_node->next(heap_); |
cur_node->SetMark(); |
} |
} |