From 865828f37ee38ce12d7636aa285dadd159a5bd5b Mon Sep 17 00:00:00 2001 From: "hpayer@chromium.org" Date: Mon, 26 Nov 2012 16:16:49 +0000 Subject: [PATCH] Forward white to grey transition only if slot is before the progress bar of a given object. BUG= Review URL: https://codereview.chromium.org/11415070 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13063 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/incremental-marking-inl.h | 8 ++++++-- src/spaces.h | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/incremental-marking-inl.h b/src/incremental-marking-inl.h index 8c64978..1c30383 100644 --- a/src/incremental-marking-inl.h +++ b/src/incremental-marking-inl.h @@ -44,8 +44,12 @@ bool IncrementalMarking::BaseRecordWrite(HeapObject* obj, if (Marking::IsBlack(obj_bit)) { MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); if (chunk->IsFlagSet(MemoryChunk::HAS_PROGRESS_BAR)) { - WhiteToGreyAndPush(value_heap_obj, value_bit); - RestartIfNotMarking(); + if (chunk->IsLeftOfProgressBar(slot)) { + WhiteToGreyAndPush(value_heap_obj, value_bit); + RestartIfNotMarking(); + } else { + return false; + } } else { BlackToGreyAndUnshift(obj, obj_bit); RestartIfNotMarking(); diff --git a/src/spaces.h b/src/spaces.h index 4fbabd6..c246c94 100644 --- a/src/spaces.h +++ b/src/spaces.h @@ -503,6 +503,12 @@ class MemoryChunk { } } + bool IsLeftOfProgressBar(Object** slot) { + Address slot_address = reinterpret_cast
(slot); + ASSERT(slot_address > this->address()); + return (slot_address - this->address() + kObjectStartOffset) < + progress_bar(); + } static void IncrementLiveBytesFromGC(Address address, int by) { MemoryChunk::FromAddress(address)->IncrementLiveBytes(by); -- 2.7.4