| Index: src/isolate.h | 
| diff --git a/src/isolate.h b/src/isolate.h | 
| index 71fe8838f87b260f69d74db209f9e17b2879ccc1..c8e1d282373bbcc3e8c8b3a7bff3991266b66be1 100644 | 
| --- a/src/isolate.h | 
| +++ b/src/isolate.h | 
| @@ -429,19 +429,25 @@ class Isolate { | 
| // not currently set). | 
| static PerIsolateThreadData* CurrentPerIsolateThreadData() { | 
| return reinterpret_cast<PerIsolateThreadData*>( | 
| -        Thread::GetThreadLocal(per_isolate_thread_data_key_)); | 
| +        Thread::GetThreadLocal(per_isolate_thread_data_key())); | 
| } | 
|  | 
| // Returns the isolate inside which the current thread is running. | 
| INLINE(static Isolate* Current()) { | 
| +    const Thread::LocalStorageKey key = isolate_key(); | 
| Isolate* isolate = reinterpret_cast<Isolate*>( | 
| -        Thread::GetExistingThreadLocal(isolate_key_)); | 
| +        Thread::GetExistingThreadLocal(key)); | 
| +    if (!isolate) { | 
| +      EnsureDefaultIsolate(); | 
| +      isolate = reinterpret_cast<Isolate*>( | 
| +          Thread::GetExistingThreadLocal(key)); | 
| +    } | 
| ASSERT(isolate != NULL); | 
| return isolate; | 
| } | 
|  | 
| INLINE(static Isolate* UncheckedCurrent()) { | 
| -    return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key_)); | 
| +    return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key())); | 
| } | 
|  | 
| // Usually called by Init(), but can be called early e.g. to allow | 
| @@ -463,7 +469,7 @@ class Isolate { | 
| // for legacy API reasons. | 
| void TearDown(); | 
|  | 
| -  bool IsDefaultIsolate() const { return this == default_isolate_; } | 
| +  bool IsDefaultIsolate() const; | 
|  | 
| // Ensures that process-wide resources and the default isolate have been | 
| // allocated. It is only necessary to call this method in rare cases, for | 
| @@ -488,14 +494,12 @@ class Isolate { | 
| // Returns the key used to store the pointer to the current isolate. | 
| // Used internally for V8 threads that do not execute JavaScript but still | 
| // are part of the domain of an isolate (like the context switcher). | 
| -  static Thread::LocalStorageKey isolate_key() { | 
| -    return isolate_key_; | 
| -  } | 
| +  static Thread::LocalStorageKey isolate_key(); | 
|  | 
| // Returns the key used to store process-wide thread IDs. | 
| -  static Thread::LocalStorageKey thread_id_key() { | 
| -    return thread_id_key_; | 
| -  } | 
| +  static Thread::LocalStorageKey thread_id_key(); | 
| + | 
| +  static Thread::LocalStorageKey per_isolate_thread_data_key(); | 
|  | 
| // If a client attempts to create a Locker without specifying an isolate, | 
| // we assume that the client is using legacy behavior. Set up the current | 
| @@ -1020,6 +1024,9 @@ class Isolate { | 
| private: | 
| Isolate(); | 
|  | 
| +  friend struct GlobalState; | 
| +  friend struct InitializeGlobalState; | 
| + | 
| // The per-process lock should be acquired before the ThreadDataTable is | 
| // modified. | 
| class ThreadDataTable { | 
| @@ -1062,16 +1069,6 @@ class Isolate { | 
| DISALLOW_COPY_AND_ASSIGN(EntryStackItem); | 
| }; | 
|  | 
| -  // This mutex protects highest_thread_id_, thread_data_table_ and | 
| -  // default_isolate_. | 
| -  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_; | 
| - | 
| void Deinit(); | 
|  | 
| static void SetIsolateThreadLocals(Isolate* isolate, | 
| @@ -1093,7 +1090,7 @@ class Isolate { | 
| // If one does not yet exist, allocate a new one. | 
| PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread(); | 
|  | 
| -// PreInits and returns a default isolate. Needed when a new thread tries | 
| +  // PreInits and returns a default isolate. Needed when a new thread tries | 
| // to create a Locker for the first time (the lock itself is in the isolate). | 
| static Isolate* GetDefaultIsolateForLocking(); | 
|  | 
|  |