Reviewers: Michael Starzinger,
Message:
Applied comments from CL 11410080.
Description:
Forward transition objects to grey if they are referenced by a large object
BUG=
Please review this at https://chromiumcodereview.appspot.com/11418032/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/incremental-marking-inl.h
Index: src/incremental-marking-inl.h
diff --git a/src/incremental-marking-inl.h b/src/incremental-marking-inl.h
index
bbe9a9d209b36cca76360b2f9b091b755dc0587a..3a62bfecce9032733391213e5dd3b6f8f7471c88
100644
--- a/src/incremental-marking-inl.h
+++ b/src/incremental-marking-inl.h
@@ -37,16 +37,24 @@ namespace internal {
bool IncrementalMarking::BaseRecordWrite(HeapObject* obj,
Object** slot,
Object* value) {
- MarkBit value_bit = Marking::MarkBitFrom(HeapObject::cast(value));
+ HeapObject* value_heap_obj = HeapObject::cast(value);
+ MarkBit value_bit = Marking::MarkBitFrom(value_heap_obj);
if (Marking::IsWhite(value_bit)) {
MarkBit obj_bit = Marking::MarkBitFrom(obj);
- if (Marking::IsBlack(obj_bit)) {
- BlackToGreyAndUnshift(obj, obj_bit);
- RestartIfNotMarking();
+ bool is_black = Marking::IsBlack(obj_bit);
+ if (is_black) {
+ MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address());
+ if (chunk->IsFlagSet(MemoryChunk::HAS_PROGRESS_BAR)) {
+ WhiteToGreyAndPush(value_heap_obj, value_bit);
+ RestartIfNotMarking();
+ } else {
+ BlackToGreyAndUnshift(obj, obj_bit);
+ RestartIfNotMarking();
+ return false;
+ }
+ } else {
+ return false;
}
-
- // Object is either grey or white. It will be scanned if survives.
- return false;
}
if (!is_compacting_) return false;
MarkBit obj_bit = Marking::MarkBitFrom(obj);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev