Chromium Code Reviews| Index: src/incremental-marking.cc |
| diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc |
| index 5b58c9d7877bb8d211da7a4375fd0d1569b55c79..e2c3c3b659b8a9cf7c214341e36501b5847de3da 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), |
| @@ -807,12 +808,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 +825,32 @@ 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) { |
|
Vyacheslav Egorov (Chromium)
2012/05/11 12:58:35
long line
Michael Starzinger
2012/05/11 14:51:53
Done.
|
| + marker_.MarkMapContents(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), |