Chromium Code Reviews| Index: src/global-handles.cc |
| diff --git a/src/global-handles.cc b/src/global-handles.cc |
| index 4a7292547f1c06b6c180bf09671abfd1492f143e..404f3ad16789c0fae684b6a496dc91b24b83a831 100644 |
| --- a/src/global-handles.cc |
| +++ b/src/global-handles.cc |
| @@ -817,8 +817,6 @@ void GlobalHandles::InvokeSecondPassPhantomCallbacks( |
| while (callbacks->length() != 0) { |
| auto callback = callbacks->RemoveLast(); |
| DCHECK(callback.node() == nullptr); |
| - // No second pass callback required. |
| - if (callback.callback() == nullptr) continue; |
|
haraken
2016/02/01 14:09:41
Shall we add DCHECK(!callback.callback())?
|
| // Fire second pass callback |
| callback.Invoke(isolate); |
| } |
| @@ -924,6 +922,7 @@ void GlobalHandles::UpdateListOfNewSpaceNodes() { |
| int GlobalHandles::DispatchPendingPhantomCallbacks( |
| bool synchronous_second_pass) { |
| int freed_nodes = 0; |
| + List<PendingPhantomCallback> second_pass_callbacks; |
| { |
| // The initial pass callbacks must simply clear the nodes. |
| for (auto i = pending_phantom_callbacks_.begin(); |
| @@ -932,24 +931,25 @@ int GlobalHandles::DispatchPendingPhantomCallbacks( |
| // Skip callbacks that have already been processed once. |
| if (callback->node() == nullptr) continue; |
| callback->Invoke(isolate()); |
| + if (callback->callback()) second_pass_callbacks.Add(*callback); |
| freed_nodes++; |
| } |
| } |
| - if (pending_phantom_callbacks_.length() > 0) { |
| + pending_phantom_callbacks_.Clear(); |
| + if (second_pass_callbacks.length() > 0) { |
| if (FLAG_optimize_for_size || FLAG_predictable || synchronous_second_pass) { |
| isolate()->heap()->CallGCPrologueCallbacks( |
| GCType::kGCTypeProcessWeakCallbacks, kNoGCCallbackFlags); |
| - InvokeSecondPassPhantomCallbacks(&pending_phantom_callbacks_, isolate()); |
| + InvokeSecondPassPhantomCallbacks(&second_pass_callbacks, isolate()); |
| isolate()->heap()->CallGCEpilogueCallbacks( |
| GCType::kGCTypeProcessWeakCallbacks, kNoGCCallbackFlags); |
| } else { |
| auto task = new PendingPhantomCallbacksSecondPassTask( |
| - &pending_phantom_callbacks_, isolate()); |
| + &second_pass_callbacks, isolate()); |
| V8::GetCurrentPlatform()->CallOnForegroundThread( |
| reinterpret_cast<v8::Isolate*>(isolate()), task); |
| } |
| } |
| - pending_phantom_callbacks_.Clear(); |
| return freed_nodes; |
| } |