| Index: src/spaces-inl.h
|
| ===================================================================
|
| --- src/spaces-inl.h (revision 7267)
|
| +++ src/spaces-inl.h (working copy)
|
| @@ -28,6 +28,7 @@
|
| #ifndef V8_SPACES_INL_H_
|
| #define V8_SPACES_INL_H_
|
|
|
| +#include "isolate.h"
|
| #include "memory.h"
|
| #include "spaces.h"
|
|
|
| @@ -56,18 +57,18 @@
|
| // Page
|
|
|
| Page* Page::next_page() {
|
| - return MemoryAllocator::GetNextPage(this);
|
| + return heap_->isolate()->memory_allocator()->GetNextPage(this);
|
| }
|
|
|
|
|
| Address Page::AllocationTop() {
|
| - PagedSpace* owner = MemoryAllocator::PageOwner(this);
|
| + PagedSpace* owner = heap_->isolate()->memory_allocator()->PageOwner(this);
|
| return owner->PageAllocationTop(this);
|
| }
|
|
|
|
|
| Address Page::AllocationWatermark() {
|
| - PagedSpace* owner = MemoryAllocator::PageOwner(this);
|
| + PagedSpace* owner = heap_->isolate()->memory_allocator()->PageOwner(this);
|
| if (this == owner->AllocationTopPage()) {
|
| return owner->top();
|
| }
|
| @@ -82,7 +83,7 @@
|
|
|
|
|
| void Page::SetAllocationWatermark(Address allocation_watermark) {
|
| - if ((Heap::gc_state() == Heap::SCAVENGE) && IsWatermarkValid()) {
|
| + if ((heap_->gc_state() == Heap::SCAVENGE) && IsWatermarkValid()) {
|
| // When iterating intergenerational references during scavenge
|
| // we might decide to promote an encountered young object.
|
| // We will allocate a space for such an object and put it
|
| @@ -219,23 +220,26 @@
|
| }
|
|
|
|
|
| -void Page::FlipMeaningOfInvalidatedWatermarkFlag() {
|
| - watermark_invalidated_mark_ ^= 1 << WATERMARK_INVALIDATED;
|
| +void Page::FlipMeaningOfInvalidatedWatermarkFlag(Heap* heap) {
|
| + heap->page_watermark_invalidated_mark_ ^= 1 << WATERMARK_INVALIDATED;
|
| }
|
|
|
|
|
| bool Page::IsWatermarkValid() {
|
| - return (flags_ & (1 << WATERMARK_INVALIDATED)) != watermark_invalidated_mark_;
|
| + return (flags_ & (1 << WATERMARK_INVALIDATED)) !=
|
| + heap_->page_watermark_invalidated_mark_;
|
| }
|
|
|
|
|
| void Page::InvalidateWatermark(bool value) {
|
| if (value) {
|
| flags_ = (flags_ & ~(1 << WATERMARK_INVALIDATED)) |
|
| - watermark_invalidated_mark_;
|
| + heap_->page_watermark_invalidated_mark_;
|
| } else {
|
| - flags_ = (flags_ & ~(1 << WATERMARK_INVALIDATED)) |
|
| - (watermark_invalidated_mark_ ^ (1 << WATERMARK_INVALIDATED));
|
| + flags_ =
|
| + (flags_ & ~(1 << WATERMARK_INVALIDATED)) |
|
| + (heap_->page_watermark_invalidated_mark_ ^
|
| + (1 << WATERMARK_INVALIDATED));
|
| }
|
|
|
| ASSERT(IsWatermarkValid() == !value);
|
| @@ -264,7 +268,7 @@
|
| void Page::ClearGCFields() {
|
| InvalidateWatermark(true);
|
| SetAllocationWatermark(ObjectAreaStart());
|
| - if (Heap::gc_state() == Heap::SCAVENGE) {
|
| + if (heap_->gc_state() == Heap::SCAVENGE) {
|
| SetCachedAllocationWatermark(ObjectAreaStart());
|
| }
|
| SetRegionMarks(kAllRegionsCleanMarks);
|
| @@ -308,6 +312,7 @@
|
| size_ = s;
|
| owner_ = o;
|
| executable_ = (o == NULL) ? NOT_EXECUTABLE : o->executable();
|
| + owner_identity_ = (o == NULL) ? FIRST_SPACE : o->identity();
|
| }
|
|
|
|
|
| @@ -408,18 +413,10 @@
|
| bool PagedSpace::Contains(Address addr) {
|
| Page* p = Page::FromAddress(addr);
|
| if (!p->is_valid()) return false;
|
| - return MemoryAllocator::IsPageInSpace(p, this);
|
| + return heap()->isolate()->memory_allocator()->IsPageInSpace(p, this);
|
| }
|
|
|
|
|
| -bool PagedSpace::SafeContains(Address addr) {
|
| - if (!MemoryAllocator::SafeIsInAPageChunk(addr)) return false;
|
| - Page* p = Page::FromAddress(addr);
|
| - if (!p->is_valid()) return false;
|
| - return MemoryAllocator::IsPageInSpace(p, this);
|
| -}
|
| -
|
| -
|
| // Try linear allocation in the page of alloc_info's allocation top. Does
|
| // not contain slow case logic (eg, move to the next page or try free list
|
| // allocation) so it can be used by all the allocation functions and for all
|
| @@ -477,7 +474,9 @@
|
|
|
|
|
| void LargeObjectChunk::Free(Executability executable) {
|
| - MemoryAllocator::FreeRawMemory(address(), size(), executable);
|
| + Isolate* isolate =
|
| + Page::FromAddress(RoundUp(address(), Page::kPageSize))->heap_->isolate();
|
| + isolate->memory_allocator()->FreeRawMemory(address(), size(), executable);
|
| }
|
|
|
| // -----------------------------------------------------------------------------
|
| @@ -501,6 +500,12 @@
|
| }
|
|
|
|
|
| +intptr_t LargeObjectSpace::Available() {
|
| + return LargeObjectChunk::ObjectSizeFor(
|
| + heap()->isolate()->memory_allocator()->Available());
|
| +}
|
| +
|
| +
|
| template <typename StringType>
|
| void NewSpace::ShrinkStringAtAllocationBoundary(String* string, int length) {
|
| ASSERT(length <= string->length());
|
| @@ -514,9 +519,9 @@
|
|
|
|
|
| bool FreeListNode::IsFreeListNode(HeapObject* object) {
|
| - return object->map() == Heap::raw_unchecked_byte_array_map()
|
| - || object->map() == Heap::raw_unchecked_one_pointer_filler_map()
|
| - || object->map() == Heap::raw_unchecked_two_pointer_filler_map();
|
| + return object->map() == HEAP->raw_unchecked_byte_array_map()
|
| + || object->map() == HEAP->raw_unchecked_one_pointer_filler_map()
|
| + || object->map() == HEAP->raw_unchecked_two_pointer_filler_map();
|
| }
|
|
|
| } } // namespace v8::internal
|
|
|