Index: runtime/vm/gc_marker.cc |
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc |
index 163a6173e2bf7173fc36730224d18ad861f421df..131273a8147f6b4a5a57c66d326e880d7ceb0bcc 100644 |
--- a/runtime/vm/gc_marker.cc |
+++ b/runtime/vm/gc_marker.cc |
@@ -187,20 +187,47 @@ class MarkingVisitor : public ObjectPointerVisitor { |
}; |
+class MarkingWeakVisitor : public ObjectPointerVisitor { |
+ public: |
+ MarkingWeakVisitor() { |
+ } |
+ |
+ void VisitPointers(RawObject** first, RawObject** last) { |
+ for (RawObject** current = first; current <= last; current++) { |
+ RawObject* raw_obj = *current; |
+ ASSERT(raw_obj->IsHeapObject()); |
+ if (!raw_obj->IsMarked() && raw_obj->IsOldObject()) { |
+ *current = Object::null(); |
+ } |
+ } |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MarkingWeakVisitor); |
+}; |
+ |
+ |
void GCMarker::Prologue(Isolate* isolate) { |
// Nothing to do at the moment. |
} |
-void GCMarker::IterateRoots(Isolate* isolate, MarkingVisitor* visitor) { |
- isolate->VisitObjectPointers(visitor, |
- StackFrameIterator::kDontValidateFrames); |
+void GCMarker::IterateRoots(Isolate* isolate, ObjectPointerVisitor* visitor) { |
+ isolate->VisitStrongObjectPointers(visitor, |
+ StackFrameIterator::kDontValidateFrames); |
heap_->IterateNewPointers(visitor); |
heap_->IterateCodePointers(visitor); |
} |
-void GCMarker::DrainMarkingStack(Isolate* isolate, MarkingVisitor* visitor) { |
+void GCMarker::IterateWeakRoots(Isolate* isolate, |
+ ObjectPointerVisitor* visitor) { |
+ isolate->VisitWeakObjectPointers(visitor); |
+} |
+ |
+ |
+void GCMarker::DrainMarkingStack(Isolate* isolate, |
+ MarkingVisitor* visitor) { |
while (!visitor->marking_stack()->IsEmpty()) { |
RawObject* raw_obj = visitor->marking_stack()->Pop(); |
raw_obj->VisitPointers(visitor); |
@@ -214,6 +241,8 @@ void GCMarker::MarkObjects(Isolate* isolate, PageSpace* page_space) { |
MarkingVisitor mark(heap_, page_space, &marking_stack); |
IterateRoots(isolate, &mark); |
DrainMarkingStack(isolate, &mark); |
+ MarkingWeakVisitor mark_weak; |
+ IterateWeakRoots(isolate, &mark_weak); |
} |
} // namespace dart |