Chromium Code Reviews| Index: Source/core/dom/Microtask.cpp |
| diff --git a/Source/core/dom/Microtask.cpp b/Source/core/dom/Microtask.cpp |
| index d2ffaed202eda2bbf59fc1a323e1a94e218ea008..3a880f39b21bbec03d766a64081b603e81338415 100644 |
| --- a/Source/core/dom/Microtask.cpp |
| +++ b/Source/core/dom/Microtask.cpp |
| @@ -31,7 +31,9 @@ |
| #include "config.h" |
| #include "core/dom/Microtask.h" |
| +#include "bindings/core/v8/ModuleProxy.h" |
| #include "bindings/core/v8/V8PerIsolateData.h" |
| +#include "bindings/core/v8/V8RecursionScope.h" |
| #include "platform/Task.h" |
| #include "public/platform/WebThread.h" |
| #include <v8.h> |
| @@ -43,13 +45,23 @@ void Microtask::performCheckpoint() |
| v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| V8PerIsolateData* isolateData = V8PerIsolateData::from(isolate); |
| ASSERT(isolateData); |
| - if (isolateData->recursionLevel() || isolateData->performingMicrotaskCheckpoint()) |
| + if (isolateData->recursionLevel() || isolateData->performingMicrotaskCheckpoint() || isolateData->destructionPending()) |
| return; |
| isolateData->setPerformingMicrotaskCheckpoint(true); |
| - isolate->RunMicrotasks(); |
| + { |
| + // Ensure that end-of-task-or-microtask actions are performed. |
| + V8RecursionScope recursionScope(isolate); |
| + isolate->RunMicrotasks(); |
| + ModuleProxy::moduleProxy().didLeaveScriptContextForRecursionScope(isolate); |
|
adamk
2014/09/22 18:30:57
I'm not familiar with this thing. Can you explain
jsbell
2014/09/22 18:49:51
Whoops, that's accidentally left in from an earlie
|
| + } |
| isolateData->setPerformingMicrotaskCheckpoint(false); |
| } |
| +bool Microtask::performingCheckpoint(v8::Isolate* isolate) |
| +{ |
| + return V8PerIsolateData::from(isolate)->performingMicrotaskCheckpoint(); |
| +} |
| + |
| static void microtaskFunctionCallback(void* data) |
| { |
| OwnPtr<WebThread::Task> task = adoptPtr(static_cast<WebThread::Task*>(data)); |