Fix multiple V8::Dispose calls since r16563.

R=svenpanne@chromium.org
BUG=v8:2744
TEST=cctest/test-api/InitializeAndDisposeMultiple

Review URL: https://codereview.chromium.org/23775007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16565 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
mstarzinger@chromium.org 2013-09-06 11:02:43 +00:00
parent 43780dbdc9
commit 15f6fdeb3e
2 changed files with 13 additions and 2 deletions

View File

@ -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);
};

View File

@ -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;