| Index: runtime/vm/scavenger.cc
|
| diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
|
| index 0465d0c093e0ed9144366f57eb3bef4c3701a53a..b04f37d2c4e2240055adb95a51ea14a448f8e497 100644
|
| --- a/runtime/vm/scavenger.cc
|
| +++ b/runtime/vm/scavenger.cc
|
| @@ -5,6 +5,7 @@
|
| #include "vm/scavenger.h"
|
|
|
| #include "vm/dart.h"
|
| +#include "vm/dart_api_state.h"
|
| #include "vm/isolate.h"
|
| #include "vm/object.h"
|
| #include "vm/stack_frame.h"
|
| @@ -130,23 +131,22 @@ class ScavengerVisitor : public ObjectPointerVisitor {
|
| };
|
|
|
|
|
| -class ScavengerWeakVisitor : public ObjectPointerVisitor {
|
| +class ScavengerWeakVisitor : public HandleVisitor {
|
| public:
|
| explicit ScavengerWeakVisitor(Scavenger* scavenger) : scavenger_(scavenger) {
|
| }
|
|
|
| - void VisitPointers(RawObject** first, RawObject** last) {
|
| - for (RawObject** current = first; current <= last; current++) {
|
| - RawObject* raw_obj = *current;
|
| - ASSERT(raw_obj->IsHeapObject());
|
| - uword raw_addr = RawObject::ToAddr(raw_obj);
|
| - if (scavenger_->from_->Contains(raw_addr)) {
|
| - uword header = *reinterpret_cast<uword*>(raw_addr);
|
| - if (IsForwarding(header)) {
|
| - *current = RawObject::FromAddr(ForwardedAddr(header));
|
| - } else {
|
| - *current = Object::null();
|
| - }
|
| + void VisitHandle(uword addr) {
|
| + WeakPersistentHandle* handle =
|
| + reinterpret_cast<WeakPersistentHandle*>(addr);
|
| + RawObject* raw_obj = handle->raw();
|
| + uword raw_addr = RawObject::ToAddr(raw_obj);
|
| + if (scavenger_->from_->Contains(raw_addr)) {
|
| + uword header = *reinterpret_cast<uword*>(raw_addr);
|
| + if (IsForwarding(header)) {
|
| + handle->set_raw(RawObject::FromAddr(ForwardedAddr(header)));
|
| + } else {
|
| + handle->Finalize();
|
| }
|
| }
|
| }
|
| @@ -224,15 +224,14 @@ void Scavenger::Epilogue() {
|
|
|
|
|
| void Scavenger::IterateRoots(Isolate* isolate, ObjectPointerVisitor* visitor) {
|
| - isolate->VisitStrongObjectPointers(visitor,
|
| - StackFrameIterator::kDontValidateFrames);
|
| + isolate->VisitObjectPointers(visitor,
|
| + StackFrameIterator::kDontValidateFrames);
|
| heap_->IterateOldPointers(visitor);
|
| }
|
|
|
|
|
| -void Scavenger::IterateWeakRoots(Isolate* isolate,
|
| - ObjectPointerVisitor* visitor) {
|
| - isolate->VisitWeakObjectPointers(visitor);
|
| +void Scavenger::IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor) {
|
| + isolate->VisitWeakPersistentHandles(visitor);
|
| }
|
|
|
|
|
|
|