| Index: src/incremental-marking.cc | 
| diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc | 
| index 5b58c9d7877bb8d211da7a4375fd0d1569b55c79..94afffa733503ac28a9a7c838c0d13963bf9b7ab 100644 | 
| --- a/src/incremental-marking.cc | 
| +++ b/src/incremental-marking.cc | 
| @@ -1,4 +1,4 @@ | 
| -// Copyright 2011 the V8 project authors. All rights reserved. | 
| +// Copyright 2012 the V8 project authors. All rights reserved. | 
| // Redistribution and use in source and binary forms, with or without | 
| // modification, are permitted provided that the following conditions are | 
| // met: | 
| @@ -42,6 +42,7 @@ IncrementalMarking::IncrementalMarking(Heap* heap) | 
| state_(STOPPED), | 
| marking_deque_memory_(NULL), | 
| marking_deque_memory_committed_(false), | 
| +      marker_(this, heap->mark_compact_collector()), | 
| steps_count_(0), | 
| steps_took_(0), | 
| longest_step_(0.0), | 
| @@ -663,6 +664,22 @@ void IncrementalMarking::Hurry() { | 
| } else if (map == global_context_map) { | 
| // Global contexts have weak fields. | 
| VisitGlobalContext(Context::cast(obj), &marking_visitor); | 
| +      } else if (map->instance_type() == MAP_TYPE) { | 
| +        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) { | 
| +          marker_.MarkMapContents(map); | 
| +        } else { | 
| +          marking_visitor.VisitPointers( | 
| +              HeapObject::RawField(map, Map::kPointerFieldsBeginOffset), | 
| +              HeapObject::RawField(map, Map::kPointerFieldsEndOffset)); | 
| +        } | 
| } else { | 
| obj->Iterate(&marking_visitor); | 
| } | 
| @@ -807,12 +824,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 +841,22 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, | 
| MarkObjectGreyDoNotEnqueue(ctx->normalized_map_cache()); | 
|  | 
| VisitGlobalContext(ctx, &marking_visitor); | 
| +      } else if (map->instance_type() == MAP_TYPE) { | 
| +        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) { | 
| +          marker_.MarkMapContents(map); | 
| +        } 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), | 
|  |