Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Unified Diff: runtime/vm/scavenger.cc

Issue 14307013: - Remember the fact that an object has been added to the (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698