| Index: src/isolate.cc
|
| diff --git a/src/isolate.cc b/src/isolate.cc
|
| index 8a30e7924fb9215c278f1467ba1d99b35fc5e54a..fa18dc5e5fc8587eecf209daf3408c0d6170c7fa 100644
|
| --- a/src/isolate.cc
|
| +++ b/src/isolate.cc
|
| @@ -76,6 +76,10 @@ int ThreadId::GetCurrentThreadId() {
|
|
|
| ThreadLocalTop::ThreadLocalTop() {
|
| InitializeInternal();
|
| + // This flag may be set using v8::V8::IgnoreOutOfMemoryException()
|
| + // before an isolate is initialized. The initialize methods below do
|
| + // not touch it to preserve its value.
|
| + ignore_out_of_memory_ = false;
|
| }
|
|
|
|
|
| @@ -382,7 +386,6 @@ void Isolate::EnsureDefaultIsolate() {
|
| if (Thread::GetThreadLocal(isolate_key_) == NULL) {
|
| Thread::SetThreadLocal(isolate_key_, default_isolate_);
|
| }
|
| - CHECK(default_isolate_->PreInit());
|
| }
|
|
|
|
|
| @@ -1375,11 +1378,15 @@ Isolate::Isolate()
|
| 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),
|
| @@ -1510,7 +1517,7 @@ void Isolate::Deinit() {
|
| logger_->TearDown();
|
|
|
| // The default isolate is re-initializable due to legacy API.
|
| - state_ = PREINITIALIZED;
|
| + state_ = UNINITIALIZED;
|
| }
|
| }
|
|
|
| @@ -1592,58 +1599,6 @@ Isolate::~Isolate() {
|
| }
|
|
|
|
|
| -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(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)
|
| -#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(this);
|
| - stub_cache_ = new StubCache(this);
|
| - ast_sentinels_ = new AstSentinels();
|
| - regexp_stack_ = new RegExpStack();
|
| - regexp_stack_->isolate_ = this;
|
| -
|
| - state_ = PREINITIALIZED;
|
| - return true;
|
| -}
|
| -
|
| -
|
| void Isolate::InitializeThreadLocal() {
|
| thread_local_top_.isolate_ = this;
|
| thread_local_top_.Initialize();
|
| @@ -1680,19 +1635,71 @@ void Isolate::PropagatePendingExceptionToExternalTryCatch() {
|
| }
|
|
|
|
|
| +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)
|
| +#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(this);
|
| + stub_cache_ = new StubCache(this);
|
| + ast_sentinels_ = new AstSentinels();
|
| + regexp_stack_ = new RegExpStack();
|
| + regexp_stack_->isolate_ = this;
|
|
|
| // Enable logging before setting up the heap
|
| logger_->Setup();
|
| @@ -1715,7 +1722,8 @@ bool Isolate::Init(Deserializer* des) {
|
| 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();
|
| @@ -1775,6 +1783,16 @@ bool Isolate::Init(Deserializer* des) {
|
| }
|
|
|
|
|
| +// 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();
|
| @@ -1814,8 +1832,6 @@ void Isolate::Enter() {
|
|
|
| SetIsolateThreadLocals(this, data);
|
|
|
| - CHECK(PreInit());
|
| -
|
| // In case it's the first time some thread enters the isolate.
|
| set_thread_id(data->thread_id());
|
| }
|
|
|