| 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),
|
|
|