Chromium Code Reviews| Index: runtime/vm/scavenger.cc |
| =================================================================== |
| --- runtime/vm/scavenger.cc (revision 33504) |
| +++ runtime/vm/scavenger.cc (working copy) |
| @@ -271,25 +271,29 @@ |
| class ScavengerWeakVisitor : public HandleVisitor { |
| public: |
| - explicit ScavengerWeakVisitor(Scavenger* scavenger) |
| + // 'prologue_weak_were_strong' is currently only used for sanity checking. |
| + 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); |
| }; |
| @@ -696,7 +700,8 @@ |
| // Setup the visitor and run a scavenge. |
| ScavengerVisitor visitor(isolate, this); |
| Prologue(isolate, invoke_api_callbacks); |
| - IterateRoots(isolate, &visitor, !invoke_api_callbacks); |
| + bool prologue_weak_are_strong = !invoke_api_callbacks; |
|
siva
2014/03/11 18:20:37
const bool prologue_weak_are_strong = ....
koda
2014/03/11 20:20:12
Done.
|
| + IterateRoots(isolate, &visitor, prologue_weak_are_strong); |
| int64_t start = OS::GetCurrentTimeMicros(); |
| ProcessToSpace(&visitor); |
| int64_t middle = OS::GetCurrentTimeMicros(); |
| @@ -704,8 +709,10 @@ |
| // 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, prologue_weak_are_strong); |
| + // Include the prologue weak handles, since we must process any promotion. |
| + bool visit_prologue_weak_handles = true; |
|
siva
2014/03/11 18:20:37
const bool visit_prologue_weak_handles = true;
Th
koda
2014/03/11 20:20:12
Done.
|
| + IterateWeakRoots(isolate, &weak_visitor, visit_prologue_weak_handles); |
| visitor.Finalize(); |
| ProcessWeakTables(); |
| int64_t end = OS::GetCurrentTimeMicros(); |