Index: src/incremental-marking.cc |
diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc |
index 5b58c9d7877bb8d211da7a4375fd0d1569b55c79..651b66cecee0745a6276f881860224f3a8ecb5ea 100644 |
--- a/src/incremental-marking.cc |
+++ b/src/incremental-marking.cc |
@@ -807,12 +807,6 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, |
Map* map = obj->map(); |
if (map == filler_map) continue; |
- if (obj->IsMap()) { |
- Map* map = Map::cast(obj); |
- heap_->ClearCacheOnMap(map); |
- } |
- |
- |
int size = obj->SizeFromMap(map); |
bytes_to_process -= size; |
MarkBit map_mark_bit = Marking::MarkBitFrom(map); |
@@ -830,6 +824,32 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, |
MarkObjectGreyDoNotEnqueue(ctx->normalized_map_cache()); |
VisitGlobalContext(ctx, &marking_visitor); |
+ } else if (map->instance_type() == JS_MAP_TYPE) { |
Vyacheslav Egorov (Chromium)
2012/05/11 12:58:35
s/JS_MAP_TYPE/MAP_TYPE/
Michael Starzinger
2012/05/11 14:51:53
Already fixed in second patch set.
|
+ Map* map = Map::cast(obj); |
+ heap_->ClearCacheOnMap(map); |
+ |
+ // When map collection is enabled we have to mark through map's |
+ // transitions and back pointers in a special way to make these links |
+ // weak. Only maps for subclasses of JSReceiver can have transitions. |
+ STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
+ if (FLAG_collect_maps && map->instance_type() >= FIRST_JS_RECEIVER_TYPE) { |
+ heap_->mark_compact_collector()->MarkWeakMapContents(map); |
+ |
+ // Mark the Object* fields of the Map. Since the descriptor array has |
+ // been marked already, it is fine that one of these fields contains a |
+ // pointer to it. But make sure to skip back pointer and prototype |
+ // transitions. |
+ STATIC_ASSERT(Map::kPointerFieldsEndOffset == |
+ Map::kPrototypeTransitionsOrBackPointerOffset + kPointerSize); |
+ marking_visitor.VisitPointers( |
+ HeapObject::RawField(map, Map::kPointerFieldsBeginOffset), |
+ HeapObject::RawField( |
+ map, Map::kPrototypeTransitionsOrBackPointerOffset)); |
+ } else { |
+ marking_visitor.VisitPointers( |
+ HeapObject::RawField(map, Map::kPointerFieldsBeginOffset), |
+ HeapObject::RawField(map, Map::kPointerFieldsEndOffset)); |
+ } |
} else if (map->instance_type() == JS_FUNCTION_TYPE) { |
marking_visitor.VisitPointers( |
HeapObject::RawField(obj, JSFunction::kPropertiesOffset), |