Reviewers: Sven Panne,

Description:
Fix multiple V8::Dispose calls since r16563.

[email protected]
BUG=v8:2744
TEST=cctest/test-api/InitializeAndDisposeMultiple

Please review this at https://codereview.chromium.org/23775007/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+13, -2 lines):
  M src/isolate.h
  M src/v8.cc


Index: src/isolate.h
diff --git a/src/isolate.h b/src/isolate.h
index 741c4c02ffb17cf409f16a4067e3fd560bc5e2b2..5ca776d580d2b3575d546515b1350f497d06f022 100644
--- a/src/isolate.h
+++ b/src/isolate.h
@@ -1383,6 +1383,7 @@ class Isolate {
   friend class v8::Isolate;
   friend class v8::Locker;
   friend class v8::Unlocker;
+  friend class V8;

   DISALLOW_COPY_AND_ASSIGN(Isolate);
 };
Index: src/v8.cc
diff --git a/src/v8.cc b/src/v8.cc
index d9ce8404acddea3391c511ee03ce20e475a27055..c4ce0629c8021b89d39f59c8703dc64371330bb8 100644
--- a/src/v8.cc
+++ b/src/v8.cc
@@ -63,8 +63,8 @@ bool V8::Initialize(Deserializer* des) {

   // The current thread may not yet had entered an isolate to run.
   // Note the Isolate::Current() may be non-null because for various
- // initialization purposes an initializing thread may be assigned an isolate
-  // but not actually enter it.
+  // initialization purposes an initializing thread may be assigned an
+  // isolate but not actually enter it.
   if (i::Isolate::CurrentPerIsolateThreadData() == NULL) {
     i::Isolate::EnterDefaultIsolate();
   }
@@ -84,6 +84,15 @@ bool V8::Initialize(Deserializer* des) {


 void V8::TearDown() {
+  // The current thread may not yet had entered an isolate to run or may
+  // have already disposed the entered isolated before.
+  // Note the Isolate::Current() may be non-null because for various
+  // initialization purposes an initializing thread may be assigned an
+  // isolate but not actually enter it.
+  if (i::Isolate::CurrentPerIsolateThreadData() == NULL) {
+    return;
+  }
+
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate->IsDefaultIsolate());
   if (!isolate->IsInitialized()) return;
@@ -91,6 +100,7 @@ void V8::TearDown() {
   // The isolate has to be torn down before clearing the LOperand
   // caches so that the optimizing compiler thread (if running)
   // doesn't see an inconsistent view of the lithium instructions.
+  Isolate::SetIsolateThreadLocals(isolate, NULL);
   isolate->TearDown();
   delete isolate;



--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to