| Index: runtime/vm/scavenger.cc
|
| ===================================================================
|
| --- runtime/vm/scavenger.cc (revision 22083)
|
| +++ runtime/vm/scavenger.cc (working copy)
|
| @@ -19,14 +19,14 @@
|
|
|
| namespace dart {
|
|
|
| -// Scavenger uses RawObject::kFreeBit to distinguish forwaded and non-forwarded
|
| -// objects because scavenger can never encounter free list element during
|
| -// evacuation and thus all objects scavenger encounters have
|
| -// kFreeBit cleared.
|
| +// Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded
|
| +// objects because scavenger can never encounter marked elements during
|
| +// evacuation and thus all objects scavenger encounters have the
|
| +// kMarkBit cleared.
|
| enum {
|
| - kForwardingMask = 1,
|
| + kForwardingMask = RawObject::kMarkBit,
|
| kNotForwarded = 0,
|
| - kForwarded = 1,
|
| + kForwarded = kForwardingMask,
|
| };
|
|
|
|
|
| @@ -122,7 +122,10 @@
|
| ASSERT(!heap_->CodeContains(ptr));
|
| ASSERT(heap_->Contains(ptr));
|
| // If the newly written object is not a new object, drop it immediately.
|
| - if (!obj->IsNewObject()) return;
|
| + if (!obj->IsNewObject() || visiting_old_object_->IsRemembered()) {
|
| + return;
|
| + }
|
| + visiting_old_object_->SetRememberedBit();
|
| isolate()->store_buffer()->AddPointer(
|
| reinterpret_cast<uword>(visiting_old_object_));
|
| }
|
| @@ -299,7 +302,6 @@
|
| // Verify assumptions about the first word in objects which the scavenger is
|
| // going to use for forwarding pointers.
|
| ASSERT(Object::tags_offset() == 0);
|
| - ASSERT(kForwardingMask == (1 << RawObject::kFreeBit));
|
|
|
| // Allocate the virtual memory for this scavenge heap.
|
| space_ = VirtualMemory::Reserve(max_capacity);
|
| @@ -399,6 +401,8 @@
|
| for (intptr_t i = 0; i < size; i++) {
|
| RawObject* raw_object = reinterpret_cast<RawObject*>(set->At(i));
|
| if (raw_object != NULL) {
|
| + ASSERT(raw_object->IsRemembered());
|
| + raw_object->ClearRememberedBit();
|
| visitor->VisitingOldObject(raw_object);
|
| raw_object->VisitPointers(visitor);
|
| handled++;
|
| @@ -536,6 +540,7 @@
|
| // Resolve or copy all objects referred to by the current object. This
|
| // can potentially push more objects on this stack as well as add more
|
| // objects to be resolved in the to space.
|
| + ASSERT(!raw_object->IsRemembered());
|
| visitor->VisitingOldObject(raw_object);
|
| raw_object->VisitPointers(visitor);
|
| }
|
|
|