| Index: src/isolate.cc
|
| ===================================================================
|
| --- src/isolate.cc (revision 8834)
|
| +++ src/isolate.cc (working copy)
|
| @@ -70,6 +70,7 @@
|
| return thread_id;
|
| }
|
|
|
| +
|
| // Create a dummy thread that will wait forever on a semaphore. The only
|
| // purpose for this thread is to have some stack area to save essential data
|
| // into for use by a stacks only core dump (aka minidump).
|
| @@ -323,7 +324,6 @@
|
| // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here
|
| // becase a non-null thread data may be already set.
|
| Thread::SetThreadLocal(isolate_key_, default_isolate_);
|
| - CHECK(default_isolate_->PreInit());
|
| }
|
|
|
|
|
| @@ -417,11 +417,15 @@
|
| bootstrapper_(NULL),
|
| runtime_profiler_(NULL),
|
| compilation_cache_(NULL),
|
| - counters_(new Counters()),
|
| + counters_(NULL),
|
| code_range_(NULL),
|
| + // Must be initialized early to allow v8::SetResourceConstraints calls.
|
| break_access_(OS::CreateMutex()),
|
| - logger_(new Logger()),
|
| - stats_table_(new StatsTable()),
|
| + debugger_initialized_(false),
|
| + // Must be initialized early to allow v8::Debug calls.
|
| + debugger_access_(OS::CreateMutex()),
|
| + logger_(NULL),
|
| + stats_table_(NULL),
|
| stub_cache_(NULL),
|
| deoptimizer_data_(NULL),
|
| capture_stack_trace_for_uncaught_exceptions_(false),
|
| @@ -463,6 +467,9 @@
|
| simulator_redirection_ = NULL;
|
| #endif
|
|
|
| + thread_manager_ = new ThreadManager();
|
| + thread_manager_->isolate_ = this;
|
| +
|
| #ifdef DEBUG
|
| // heap_histograms_ initializes itself.
|
| memset(&js_spill_information_, 0, sizeof(js_spill_information_));
|
| @@ -548,7 +555,7 @@
|
| logger_->TearDown();
|
|
|
| // The default isolate is re-initializable due to legacy API.
|
| - state_ = PREINITIALIZED;
|
| + state_ = UNINITIALIZED;
|
| }
|
| }
|
|
|
| @@ -635,68 +642,6 @@
|
| }
|
|
|
|
|
| -bool Isolate::PreInit() {
|
| - if (state_ != UNINITIALIZED) return true;
|
| -
|
| - TRACE_ISOLATE(preinit);
|
| -
|
| - ASSERT(Isolate::Current() == this);
|
| -
|
| -#ifdef ENABLE_DEBUGGER_SUPPORT
|
| - debug_ = new Debug(this);
|
| - debugger_ = new Debugger();
|
| - debugger_->isolate_ = this;
|
| -#endif
|
| -
|
| - memory_allocator_ = new MemoryAllocator();
|
| - memory_allocator_->isolate_ = this;
|
| - code_range_ = new CodeRange();
|
| - code_range_->isolate_ = this;
|
| -
|
| - // Safe after setting Heap::isolate_, initializing StackGuard and
|
| - // ensuring that Isolate::Current() == this.
|
| - heap_.SetStackLimits();
|
| -
|
| -#ifdef DEBUG
|
| - DisallowAllocationFailure disallow_allocation_failure;
|
| -#endif
|
| -
|
| -#define C(name) isolate_addresses_[Isolate::k_##name] = \
|
| - reinterpret_cast<Address>(name());
|
| - ISOLATE_ADDRESS_LIST(C)
|
| - ISOLATE_ADDRESS_LIST_PROF(C)
|
| -#undef C
|
| -
|
| - string_tracker_ = new StringTracker();
|
| - string_tracker_->isolate_ = this;
|
| - thread_manager_ = new ThreadManager();
|
| - thread_manager_->isolate_ = this;
|
| - compilation_cache_ = new CompilationCache(this);
|
| - transcendental_cache_ = new TranscendentalCache();
|
| - keyed_lookup_cache_ = new KeyedLookupCache();
|
| - context_slot_cache_ = new ContextSlotCache();
|
| - descriptor_lookup_cache_ = new DescriptorLookupCache();
|
| - unicode_cache_ = new UnicodeCache();
|
| - pc_to_code_cache_ = new PcToCodeCache(this);
|
| - write_input_buffer_ = new StringInputBuffer();
|
| - global_handles_ = new GlobalHandles(this);
|
| - bootstrapper_ = new Bootstrapper();
|
| - handle_scope_implementer_ = new HandleScopeImplementer();
|
| - stub_cache_ = new StubCache(this);
|
| - ast_sentinels_ = new AstSentinels();
|
| - regexp_stack_ = new RegExpStack();
|
| - regexp_stack_->isolate_ = this;
|
| -
|
| -#ifdef ENABLE_LOGGING_AND_PROFILING
|
| - producer_heap_profile_ = new ProducerHeapProfile();
|
| - producer_heap_profile_->isolate_ = this;
|
| -#endif
|
| -
|
| - state_ = PREINITIALIZED;
|
| - return true;
|
| -}
|
| -
|
| -
|
| void Isolate::InitializeThreadLocal() {
|
| thread_local_top_.Initialize();
|
| clear_pending_exception();
|
| @@ -732,20 +677,78 @@
|
| }
|
|
|
|
|
| +void Isolate::InitializeLoggingAndCounters() {
|
| + if (logger_ == NULL) {
|
| + logger_ = new Logger;
|
| + }
|
| + if (counters_ == NULL) {
|
| + counters_ = new Counters;
|
| + }
|
| +}
|
| +
|
| +
|
| +void Isolate::InitializeDebugger() {
|
| +#ifdef ENABLE_DEBUGGER_SUPPORT
|
| + ScopedLock lock(debugger_access_);
|
| + if (NoBarrier_Load(&debugger_initialized_)) return;
|
| + InitializeLoggingAndCounters();
|
| + debug_ = new Debug(this);
|
| + debugger_ = new Debugger(this);
|
| + Release_Store(&debugger_initialized_, true);
|
| +#endif
|
| +}
|
| +
|
| +
|
| bool Isolate::Init(Deserializer* des) {
|
| ASSERT(state_ != INITIALIZED);
|
| -
|
| + ASSERT(Isolate::Current() == this);
|
| TRACE_ISOLATE(init);
|
|
|
| - bool create_heap_objects = des == NULL;
|
| -
|
| #ifdef DEBUG
|
| // The initialization process does not handle memory exhaustion.
|
| DisallowAllocationFailure disallow_allocation_failure;
|
| #endif
|
|
|
| - if (state_ == UNINITIALIZED && !PreInit()) return false;
|
| + InitializeLoggingAndCounters();
|
|
|
| + InitializeDebugger();
|
| +
|
| + memory_allocator_ = new MemoryAllocator(this);
|
| + code_range_ = new CodeRange(this);
|
| +
|
| + // Safe after setting Heap::isolate_, initializing StackGuard and
|
| + // ensuring that Isolate::Current() == this.
|
| + heap_.SetStackLimits();
|
| +
|
| +#define C(name) isolate_addresses_[Isolate::k_##name] = \
|
| + reinterpret_cast<Address>(name());
|
| + ISOLATE_ADDRESS_LIST(C)
|
| + ISOLATE_ADDRESS_LIST_PROF(C)
|
| +#undef C
|
| +
|
| + string_tracker_ = new StringTracker();
|
| + string_tracker_->isolate_ = this;
|
| + compilation_cache_ = new CompilationCache(this);
|
| + transcendental_cache_ = new TranscendentalCache();
|
| + keyed_lookup_cache_ = new KeyedLookupCache();
|
| + context_slot_cache_ = new ContextSlotCache();
|
| + descriptor_lookup_cache_ = new DescriptorLookupCache();
|
| + unicode_cache_ = new UnicodeCache();
|
| + pc_to_code_cache_ = new PcToCodeCache(this);
|
| + write_input_buffer_ = new StringInputBuffer();
|
| + global_handles_ = new GlobalHandles(this);
|
| + bootstrapper_ = new Bootstrapper();
|
| + handle_scope_implementer_ = new HandleScopeImplementer();
|
| + stub_cache_ = new StubCache(this);
|
| + ast_sentinels_ = new AstSentinels();
|
| + regexp_stack_ = new RegExpStack();
|
| + regexp_stack_->isolate_ = this;
|
| +
|
| +#ifdef ENABLE_LOGGING_AND_PROFILING
|
| + producer_heap_profile_ = new ProducerHeapProfile();
|
| + producer_heap_profile_->isolate_ = this;
|
| +#endif
|
| +
|
| // Enable logging before setting up the heap
|
| logger_->Setup();
|
|
|
| @@ -767,7 +770,8 @@
|
| stack_guard_.InitThread(lock);
|
| }
|
|
|
| - // Setup the object heap
|
| + // Setup the object heap.
|
| + const bool create_heap_objects = (des == NULL);
|
| ASSERT(!heap_.HasBeenSetup());
|
| if (!heap_.Setup(create_heap_objects)) {
|
| V8::SetFatalError();
|
| @@ -827,6 +831,16 @@
|
| }
|
|
|
|
|
| +// Initialized lazily to allow early
|
| +// v8::V8::SetAddHistogramSampleFunction calls.
|
| +StatsTable* Isolate::stats_table() {
|
| + if (stats_table_ == NULL) {
|
| + stats_table_ = new StatsTable;
|
| + }
|
| + return stats_table_;
|
| +}
|
| +
|
| +
|
| void Isolate::Enter() {
|
| Isolate* current_isolate = NULL;
|
| PerIsolateThreadData* current_data = CurrentPerIsolateThreadData();
|
| @@ -866,8 +880,6 @@
|
|
|
| SetIsolateThreadLocals(this, data);
|
|
|
| - CHECK(PreInit());
|
| -
|
| // In case it's the first time some thread enters the isolate.
|
| set_thread_id(data->thread_id());
|
| }
|
|
|