Index: third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp |
index 65c02bcd042673e5564ec6d50a3bba4e56cd1a79..0a2cfcb91e350d51b0e373a3f71707588fbdf081 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp |
@@ -30,6 +30,7 @@ |
#include "bindings/core/v8/V8Binding.h" |
#include "bindings/core/v8/V8HiddenValue.h" |
#include "bindings/core/v8/V8ObjectConstructor.h" |
+#include "bindings/core/v8/V8RecursionScope.h" |
#include "bindings/core/v8/V8ScriptRunner.h" |
#include "core/frame/Deprecation.h" |
#include "core/inspector/MainThreadDebugger.h" |
@@ -52,6 +53,18 @@ static void microtasksCompletedCallback(v8::Isolate* isolate) |
V8PerIsolateData::from(isolate)->runEndOfScopeTasks(); |
} |
+#if ENABLE(ASSERT) |
+static void assertV8RecursionScope(v8::Isolate* isolate) |
+{ |
+ ASSERT(V8RecursionScope::properlyUsed(isolate)); |
+} |
+ |
+static bool runningUnitTest() |
+{ |
+ return Platform::current()->unitTestSupport(); |
+} |
+#endif |
+ |
static void useCounterCallback(v8::Isolate* isolate, v8::Isolate::UseCounterFeature feature) |
{ |
UseCounter::Feature blinkFeature; |
@@ -130,15 +143,25 @@ static void useCounterCallback(v8::Isolate* isolate, v8::Isolate::UseCounterFeat |
} |
V8PerIsolateData::V8PerIsolateData() |
- : m_isolateHolder(adoptPtr(new gin::IsolateHolder())) |
+ : m_destructionPending(false) |
+ , m_isolateHolder(adoptPtr(new gin::IsolateHolder())) |
, m_stringCache(adoptPtr(new StringCache(isolate()))) |
, m_hiddenValue(V8HiddenValue::create()) |
, m_constructorMode(ConstructorMode::CreateNewObject) |
+ , m_recursionLevel(0) |
, m_isHandlingRecursionLevelError(false) |
, m_isReportingException(false) |
+#if ENABLE(ASSERT) |
+ , m_internalScriptRecursionLevel(0) |
+#endif |
+ , m_performingMicrotaskCheckpoint(false) |
{ |
// FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone. |
isolate()->Enter(); |
+#if ENABLE(ASSERT) |
+ if (!runningUnitTest()) |
+ isolate()->AddCallCompletedCallback(&assertV8RecursionScope); |
+#endif |
isolate()->AddBeforeCallEnteredCallback(&beforeCallEnteredCallback); |
isolate()->AddMicrotasksCompletedCallback(µtasksCompletedCallback); |
if (isMainThread()) |
@@ -183,6 +206,9 @@ void V8PerIsolateData::willBeDestroyed(v8::Isolate* isolate) |
{ |
V8PerIsolateData* data = from(isolate); |
+ ASSERT(!data->m_destructionPending); |
+ data->m_destructionPending = true; |
+ |
data->m_threadDebugger.clear(); |
// Clear any data that may have handles into the heap, |
// prior to calling ThreadState::detach(). |
@@ -193,6 +219,10 @@ void V8PerIsolateData::willBeDestroyed(v8::Isolate* isolate) |
// gets called but before the Isolate exits. |
void V8PerIsolateData::destroy(v8::Isolate* isolate) |
{ |
+#if ENABLE(ASSERT) |
+ if (!runningUnitTest()) |
+ isolate->RemoveCallCompletedCallback(&assertV8RecursionScope); |
+#endif |
isolate->RemoveBeforeCallEnteredCallback(&beforeCallEnteredCallback); |
isolate->RemoveMicrotasksCompletedCallback(µtasksCompletedCallback); |
V8PerIsolateData* data = from(isolate); |