Index: runtime/vm/gc_marker.cc |
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc |
index 131273a8147f6b4a5a57c66d326e880d7ceb0bcc..a01b6e8c75827f58135f5e2d348a3e0ca76cb660 100644 |
--- a/runtime/vm/gc_marker.cc |
+++ b/runtime/vm/gc_marker.cc |
@@ -5,6 +5,7 @@ |
#include "vm/gc_marker.h" |
#include "vm/allocation.h" |
+#include "vm/dart_api_state.h" |
#include "vm/isolate.h" |
#include "vm/pages.h" |
#include "vm/raw_object.h" |
@@ -187,18 +188,18 @@ class MarkingVisitor : public ObjectPointerVisitor { |
}; |
-class MarkingWeakVisitor : public ObjectPointerVisitor { |
+class MarkingWeakVisitor : public HandleVisitor { |
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(); |
- } |
+ void VisitHandle(uword* addr) { |
+ WeakPersistentHandle* handle = |
+ reinterpret_cast<WeakPersistentHandle*>(addr); |
+ RawObject* raw_obj = handle->raw(); |
+ ASSERT(raw_obj->IsHeapObject()); |
+ if (!raw_obj->IsMarked() && raw_obj->IsOldObject()) { |
+ handle->Finalize(); |
Anton Muhin
2012/01/12 13:40:26
there might be unpleasant problem: naively impleme
cshapiro
2012/01/12 18:15:38
Correct. There is one case we consider to be safe
Anton Muhin
2012/01/13 14:20:58
Carl, sorry, I wasn't clear enough regarding #2.
cshapiro
2012/01/13 22:56:46
Thanks for the clarification.
I discussed your co
|
} |
} |
@@ -213,16 +214,15 @@ void GCMarker::Prologue(Isolate* isolate) { |
void GCMarker::IterateRoots(Isolate* isolate, ObjectPointerVisitor* visitor) { |
- isolate->VisitStrongObjectPointers(visitor, |
- StackFrameIterator::kDontValidateFrames); |
+ isolate->VisitObjectPointers(visitor, |
+ StackFrameIterator::kDontValidateFrames); |
heap_->IterateNewPointers(visitor); |
heap_->IterateCodePointers(visitor); |
} |
-void GCMarker::IterateWeakRoots(Isolate* isolate, |
- ObjectPointerVisitor* visitor) { |
- isolate->VisitWeakObjectPointers(visitor); |
+void GCMarker::IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor) { |
+ isolate->VisitWeakPersistentHandles(visitor); |
} |