bool v8::V8::Dispose() {
- i::Isolate* isolate = i::Isolate::Current();
- if (!Utils::ApiCheck(isolate != NULL && isolate->IsDefaultIsolate(),
- "v8::V8::Dispose()",
- "Use v8::Isolate::Dispose() for non-default isolate.")) {
- return false;
- }
i::V8::TearDown();
return true;
}
v8::V8::SetArrayBufferAllocator(&array_buffer_allocator);
}
int result = 0;
- Isolate* isolate = Isolate::GetCurrent();
+ Isolate* isolate = Isolate::New();
#ifndef V8_SHARED
v8::ResourceConstraints constraints;
constraints.ConfigureDefaults(i::OS::TotalPhysicalMemory(),
#endif
DumbLineEditor dumb_line_editor(isolate);
{
+ Isolate::Scope scope(isolate);
Initialize(isolate);
#ifdef ENABLE_VTUNE_JIT_INTERFACE
vTune::InitializeVtuneForV8();
}
-Isolate* Isolate::default_isolate_ = NULL;
Thread::LocalStorageKey Isolate::isolate_key_;
Thread::LocalStorageKey Isolate::thread_id_key_;
Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_;
void Isolate::EnsureDefaultIsolate() {
LockGuard<Mutex> lock_guard(&process_wide_mutex_);
CHECK(default_isolate_status_ != kDefaultIsolateCrashIfInitialized);
- if (default_isolate_ == NULL) {
+ if (thread_data_table_ == NULL) {
isolate_key_ = Thread::CreateThreadLocalKey();
thread_id_key_ = Thread::CreateThreadLocalKey();
per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey();
PerThreadAssertScopeBase::thread_local_key = Thread::CreateThreadLocalKey();
#endif // DEBUG
thread_data_table_ = new Isolate::ThreadDataTable();
- default_isolate_ = new Isolate();
- }
- // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here
- // because a non-null thread data may be already set.
- if (Thread::GetThreadLocal(isolate_key_) == NULL) {
- Thread::SetThreadLocal(isolate_key_, default_isolate_);
}
}
serialize_partial_snapshot_cache_ = NULL;
}
- if (!IsDefaultIsolate()) {
- delete this;
- }
+ delete this;
// Restore the previous current isolate.
SetIsolateThreadLocals(saved_isolate, saved_data);
static void GlobalTearDown();
- bool IsDefaultIsolate() const { return this == default_isolate_; }
-
static void SetCrashIfDefaultIsolateInitialized();
// Ensures that process-wide resources and the default isolate have been
// allocated. It is only necessary to call this method in rare cases, for
DISALLOW_COPY_AND_ASSIGN(EntryStackItem);
};
- // This mutex protects highest_thread_id_, thread_data_table_ and
- // default_isolate_.
+ // This mutex protects highest_thread_id_ and thread_data_table_.
static Mutex process_wide_mutex_;
static Thread::LocalStorageKey per_isolate_thread_data_key_;
static Thread::LocalStorageKey isolate_key_;
static Thread::LocalStorageKey thread_id_key_;
- static Isolate* default_isolate_;
static ThreadDataTable* thread_data_table_;
// A global counter for all generated Isolates, might overflow.
static void AddIsolateIdIfNeeded(Isolate* isolate, StringStream* stream) {
- if (isolate->IsDefaultIsolate() || !FLAG_logfile_per_isolate) return;
- stream->Add("isolate-%p-", isolate);
+ if (FLAG_logfile_per_isolate) stream->Add("isolate-%p-", isolate);
}
static SmartArrayPointer<const char> PrepareLogFileName(
Isolate* isolate, const char* file_name) {
- if (strchr(file_name, '%') != NULL || !isolate->IsDefaultIsolate()) {
- // If there's a '%' in the log file name we have to expand
- // placeholders.
- HeapStringAllocator allocator;
- StringStream stream(&allocator);
- AddIsolateIdIfNeeded(isolate, &stream);
- for (const char* p = file_name; *p; p++) {
- if (*p == '%') {
- p++;
- switch (*p) {
- case '\0':
- // If there's a % at the end of the string we back up
- // one character so we can escape the loop properly.
- p--;
- break;
- case 'p':
- stream.Add("%d", OS::GetCurrentProcessId());
- break;
- case 't': {
- // %t expands to the current time in milliseconds.
- double time = OS::TimeCurrentMillis();
- stream.Add("%.0f", FmtElm(time));
- break;
- }
- case '%':
- // %% expands (contracts really) to %.
- stream.Put('%');
- break;
- default:
- // All other %'s expand to themselves.
- stream.Put('%');
- stream.Put(*p);
- break;
+ HeapStringAllocator allocator;
+ StringStream stream(&allocator);
+ AddIsolateIdIfNeeded(isolate, &stream);
+ for (const char* p = file_name; *p; p++) {
+ if (*p == '%') {
+ p++;
+ switch (*p) {
+ case '\0':
+ // If there's a % at the end of the string we back up
+ // one character so we can escape the loop properly.
+ p--;
+ break;
+ case 'p':
+ stream.Add("%d", OS::GetCurrentProcessId());
+ break;
+ case 't': {
+ // %t expands to the current time in milliseconds.
+ double time = OS::TimeCurrentMillis();
+ stream.Add("%.0f", FmtElm(time));
+ break;
}
- } else {
- stream.Put(*p);
+ case '%':
+ // %% expands (contracts really) to %.
+ stream.Put('%');
+ break;
+ default:
+ // All other %'s expand to themselves.
+ stream.Put('%');
+ stream.Put(*p);
+ break;
}
+ } else {
+ stream.Put(*p);
}
- return SmartArrayPointer<const char>(stream.ToCString());
}
- int length = StrLength(file_name);
- char* str = NewArray<char>(length + 1);
- OS::MemCopy(str, file_name, length);
- str[length] = '\0';
- return SmartArrayPointer<const char>(str);
+ return SmartArrayPointer<const char>(stream.ToCString());
}
isolate->Exit();
isolate->Dispose();
- V8::Dispose();
+ // TODO(svenpanne) Alas, we can't cleanly dispose V8 here, because
+ // Serializer::code_address_map_ is static (a.k.a. a global variable), and
+ // disposing that would involve accessing the Isolate just disposed.
+ // code_address_map_ really has to be an instance variable...
+ // V8::Dispose();
return 0;
}
void V8::TearDown() {
- Isolate* isolate = Isolate::Current();
- ASSERT(isolate->IsDefaultIsolate());
- if (!isolate->IsInitialized()) return;
-
- // 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->TearDown();
- delete isolate;
-
Bootstrapper::TearDownExtensions();
ElementsAccessor::TearDown();
LOperand::TearDownCaches();
for (int i = 1; i < argc; i++) {
char* arg = argv[i];
if (strcmp(arg, "--list") == 0) {
+ // TODO(svenpanne) Serializer::enabled() and Serializer::code_address_map_
+ // are fundamentally broken, so we can't unconditionally initialize and
+ // dispose V8.
+ v8::V8::Initialize();
PrintTestList(CcTest::last());
print_run_count = false;
if (print_run_count && tests_run != 1)
printf("Ran %i tests.\n", tests_run);
CcTest::TearDown();
- if (!disable_automatic_dispose_) v8::V8::Dispose();
+ // TODO(svenpanne) See comment above.
+ // if (!disable_automatic_dispose_) v8::V8::Dispose();
return 0;
}
v8::Isolate* current_isolate = CcTest::isolate();
v8::Isolate* isolate = v8::Isolate::New();
CHECK(isolate != NULL);
- CHECK(!reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate());
CHECK(current_isolate != isolate);
CHECK(current_isolate == CcTest::isolate());