Chromium Code Reviews| Index: runtime/vm/scavenger.cc |
| =================================================================== |
| --- runtime/vm/scavenger.cc (revision 33504) |
| +++ runtime/vm/scavenger.cc (working copy) |
| @@ -271,25 +271,28 @@ |
| class ScavengerWeakVisitor : public HandleVisitor { |
| public: |
| - explicit ScavengerWeakVisitor(Scavenger* scavenger) |
| + explicit ScavengerWeakVisitor(Scavenger* scavenger, |
| + bool prologue_weak_were_strong) |
| : HandleVisitor(Isolate::Current()), |
| - scavenger_(scavenger) { |
| + scavenger_(scavenger), |
| + prologue_weak_were_strong_(prologue_weak_were_strong) { |
| } |
| void VisitHandle(uword addr, bool is_prologue_weak) { |
| FinalizablePersistentHandle* handle = |
| reinterpret_cast<FinalizablePersistentHandle*>(addr); |
| RawObject** p = handle->raw_addr(); |
| - Heap::Space before = handle->SpaceForExternal(); |
| if (scavenger_->IsUnreachable(p)) { |
| + ASSERT(!is_prologue_weak || prologue_weak_were_strong_); |
| handle->UpdateUnreachable(isolate(), is_prologue_weak); |
| } else { |
| - handle->UpdateRelocated(before, isolate()); |
| + handle->UpdateRelocated(isolate()); |
| } |
| } |
| private: |
| Scavenger* scavenger_; |
| + bool prologue_weak_were_strong_; |
| DISALLOW_COPY_AND_ASSIGN(ScavengerWeakVisitor); |
| }; |
| @@ -704,8 +707,8 @@ |
| // Done with promoted stack; restore external allocation. |
| ASSERT(!PromotedStackHasMore()); |
| AllocateExternal(saved_external); |
| - ScavengerWeakVisitor weak_visitor(this); |
| - IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); |
| + ScavengerWeakVisitor weak_visitor(this, !invoke_api_callbacks); |
| + IterateWeakRoots(isolate, &weak_visitor, true); |
|
siva
2014/03/11 16:35:01
Why did you set the parameter 'visit_prologue_weak
koda
2014/03/11 17:35:45
Because we must visit the prologue weak persistent
|
| visitor.Finalize(); |
| ProcessWeakTables(); |
| int64_t end = OS::GetCurrentTimeMicros(); |