diff options
Diffstat (limited to 'deps/v8/src/heap-inl.h')
-rw-r--r-- | deps/v8/src/heap-inl.h | 104 |
1 files changed, 61 insertions, 43 deletions
diff --git a/deps/v8/src/heap-inl.h b/deps/v8/src/heap-inl.h index 4bd893e8ee..7b666af5b0 100644 --- a/deps/v8/src/heap-inl.h +++ b/deps/v8/src/heap-inl.h @@ -33,26 +33,15 @@ #include "list-inl.h" #include "objects.h" #include "v8-counters.h" -#include "store-buffer.h" -#include "store-buffer-inl.h" namespace v8 { namespace internal { void PromotionQueue::insert(HeapObject* target, int size) { - if (NewSpacePage::IsAtStart(reinterpret_cast<Address>(rear_))) { - NewSpacePage* rear_page = - NewSpacePage::FromAddress(reinterpret_cast<Address>(rear_)); - ASSERT(!rear_page->prev_page()->is_anchor()); - rear_ = reinterpret_cast<intptr_t*>(rear_page->prev_page()->body_limit()); - } *(--rear_) = reinterpret_cast<intptr_t>(target); *(--rear_) = size; // Assert no overflow into live objects. -#ifdef DEBUG - SemiSpace::AssertValidRange(HEAP->new_space()->top(), - reinterpret_cast<Address>(rear_)); -#endif + ASSERT(reinterpret_cast<Address>(rear_) >= HEAP->new_space()->top()); } @@ -95,7 +84,7 @@ MaybeObject* Heap::AllocateAsciiSymbol(Vector<const char> str, // Allocate string. Object* result; { MaybeObject* maybe_result = (size > MaxObjectSizeInPagedSpace()) - ? lo_space_->AllocateRaw(size, NOT_EXECUTABLE) + ? lo_space_->AllocateRaw(size) : old_data_space_->AllocateRaw(size); if (!maybe_result->ToObject(&result)) return maybe_result; } @@ -128,7 +117,7 @@ MaybeObject* Heap::AllocateTwoByteSymbol(Vector<const uc16> str, // Allocate string. Object* result; { MaybeObject* maybe_result = (size > MaxObjectSizeInPagedSpace()) - ? lo_space_->AllocateRaw(size, NOT_EXECUTABLE) + ? lo_space_->AllocateRaw(size) : old_data_space_->AllocateRaw(size); if (!maybe_result->ToObject(&result)) return maybe_result; } @@ -192,7 +181,7 @@ MaybeObject* Heap::AllocateRaw(int size_in_bytes, } else if (CODE_SPACE == space) { result = code_space_->AllocateRaw(size_in_bytes); } else if (LO_SPACE == space) { - result = lo_space_->AllocateRaw(size_in_bytes, NOT_EXECUTABLE); + result = lo_space_->AllocateRaw(size_in_bytes); } else if (CELL_SPACE == space) { result = cell_space_->AllocateRaw(size_in_bytes); } else { @@ -276,11 +265,6 @@ bool Heap::InNewSpace(Object* object) { } -bool Heap::InNewSpace(Address addr) { - return new_space_.Contains(addr); -} - - bool Heap::InFromSpace(Object* object) { return new_space_.FromSpaceContains(object); } @@ -291,36 +275,29 @@ bool Heap::InToSpace(Object* object) { } -bool Heap::OldGenerationAllocationLimitReached() { - if (!incremental_marking()->IsStopped()) return false; - return OldGenerationSpaceAvailable() < 0; -} - - bool Heap::ShouldBePromoted(Address old_address, int object_size) { // An object should be promoted if: // - the object has survived a scavenge operation or // - to space is already 25% full. - NewSpacePage* page = NewSpacePage::FromAddress(old_address); - Address age_mark = new_space_.age_mark(); - bool below_mark = page->IsFlagSet(MemoryChunk::NEW_SPACE_BELOW_AGE_MARK) && - (!page->ContainsLimit(age_mark) || old_address < age_mark); - return below_mark || (new_space_.Size() + object_size) >= - (new_space_.EffectiveCapacity() >> 2); + return old_address < new_space_.age_mark() + || (new_space_.Size() + object_size) >= (new_space_.Capacity() >> 2); } void Heap::RecordWrite(Address address, int offset) { - if (!InNewSpace(address)) store_buffer_.Mark(address + offset); + if (new_space_.Contains(address)) return; + ASSERT(!new_space_.FromSpaceContains(address)); + SLOW_ASSERT(Contains(address + offset)); + Page::FromAddress(address)->MarkRegionDirty(address + offset); } void Heap::RecordWrites(Address address, int start, int len) { - if (!InNewSpace(address)) { - for (int i = 0; i < len; i++) { - store_buffer_.Mark(address + start + i * kPointerSize); - } - } + if (new_space_.Contains(address)) return; + ASSERT(!new_space_.FromSpaceContains(address)); + Page* page = Page::FromAddress(address); + page->SetRegionMarks(page->GetRegionMarks() | + page->GetRegionMaskForSpan(address + start, len * kPointerSize)); } @@ -366,6 +343,31 @@ void Heap::CopyBlock(Address dst, Address src, int byte_size) { } +void Heap::CopyBlockToOldSpaceAndUpdateRegionMarks(Address dst, + Address src, + int byte_size) { + ASSERT(IsAligned(byte_size, kPointerSize)); + + Page* page = Page::FromAddress(dst); + uint32_t marks = page->GetRegionMarks(); + + for (int remaining = byte_size / kPointerSize; + remaining > 0; + remaining--) { + Memory::Object_at(dst) = Memory::Object_at(src); + + if (InNewSpace(Memory::Object_at(dst))) { + marks |= page->GetRegionMaskForAddress(dst); + } + + dst += kPointerSize; + src += kPointerSize; + } + + page->SetRegionMarks(marks); +} + + void Heap::MoveBlock(Address dst, Address src, int byte_size) { ASSERT(IsAligned(byte_size, kPointerSize)); @@ -385,6 +387,16 @@ void Heap::MoveBlock(Address dst, Address src, int byte_size) { } +void Heap::MoveBlockToOldSpaceAndUpdateRegionMarks(Address dst, + Address src, + int byte_size) { + ASSERT(IsAligned(byte_size, kPointerSize)); + ASSERT((dst < src) || (dst >= (src + byte_size))); + + CopyBlockToOldSpaceAndUpdateRegionMarks(dst, src, byte_size); +} + + void Heap::ScavengePointer(HeapObject** p) { ScavengeObject(p, *p); } @@ -402,9 +414,7 @@ void Heap::ScavengeObject(HeapObject** p, HeapObject* object) { // If the first word is a forwarding address, the object has already been // copied. if (first_word.IsForwardingAddress()) { - HeapObject* dest = first_word.ToForwardingAddress(); - ASSERT(HEAP->InFromSpace(*p)); - *p = dest; + *p = first_word.ToForwardingAddress(); return; } @@ -449,7 +459,7 @@ int Heap::AdjustAmountOfExternalAllocatedMemory(int change_in_bytes) { amount_of_external_allocated_memory_ - amount_of_external_allocated_memory_at_last_global_gc_; if (amount_since_last_global_gc > external_allocation_limit_) { - CollectAllGarbage(kNoGCFlags); + CollectAllGarbage(false); } } else { // Avoid underflow. @@ -466,7 +476,6 @@ void Heap::SetLastScriptId(Object* last_script_id) { roots_[kLastScriptIdRootIndex] = last_script_id; } - Isolate* Heap::isolate() { return reinterpret_cast<Isolate*>(reinterpret_cast<intptr_t>(this) - reinterpret_cast<size_t>(reinterpret_cast<Isolate*>(4)->heap()) + 4); @@ -679,6 +688,15 @@ Heap* _inline_get_heap_() { } +void MarkCompactCollector::SetMark(HeapObject* obj) { + tracer_->increment_marked_count(); +#ifdef DEBUG + UpdateLiveObjectCount(obj); +#endif + obj->SetMark(); +} + + } } // namespace v8::internal #endif // V8_HEAP_INL_H_ |