| Index: src/assert-scope.h | 
| diff --git a/src/assert-scope.h b/src/assert-scope.h | 
| index d32d680d1c18410f5c9bef37c52401e6c133bb26..e2ec542a7708230af2bee1fc4f4840218afd967e 100644 | 
| --- a/src/assert-scope.h | 
| +++ b/src/assert-scope.h | 
| @@ -48,7 +48,7 @@ enum PerThreadAssertType { | 
| #ifdef DEBUG | 
| class PerThreadAssertData { | 
| public: | 
| -  PerThreadAssertData() { | 
| +  PerThreadAssertData() : nesting_level_(0) { | 
| for (int i = 0; i < LAST_PER_THREAD_ASSERT_TYPE; i++) { | 
| assert_states_[i] = true; | 
| } | 
| @@ -62,8 +62,12 @@ class PerThreadAssertData { | 
| return assert_states_[type]; | 
| } | 
|  | 
| +  void increment_level() { ++nesting_level_; } | 
| +  bool decrement_level() { return --nesting_level_ == 0; } | 
| + | 
| private: | 
| bool assert_states_[LAST_PER_THREAD_ASSERT_TYPE]; | 
| +  int nesting_level_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(PerThreadAssertData); | 
| }; | 
| @@ -72,7 +76,22 @@ class PerThreadAssertData { | 
|  | 
| class PerThreadAssertScopeBase { | 
| #ifdef DEBUG | 
| + | 
| protected: | 
| +  PerThreadAssertScopeBase() { | 
| +    data_ = AssertData(); | 
| +    data_->increment_level(); | 
| +  } | 
| + | 
| +  ~PerThreadAssertScopeBase() { | 
| +    if (!data_->decrement_level()) return; | 
| +    for (int i = 0; i < LAST_PER_THREAD_ASSERT_TYPE; i++) { | 
| +      ASSERT(data_->get(static_cast<PerThreadAssertType>(i))); | 
| +    } | 
| +    delete data_; | 
| +    Thread::SetThreadLocal(thread_local_key, NULL); | 
| +  } | 
| + | 
| static PerThreadAssertData* AssertData() { | 
| PerThreadAssertData* data = reinterpret_cast<PerThreadAssertData*>( | 
| Thread::GetThreadLocal(thread_local_key)); | 
| @@ -84,6 +103,7 @@ class PerThreadAssertScopeBase { | 
| } | 
|  | 
| static Thread::LocalStorageKey thread_local_key; | 
| +  PerThreadAssertData* data_; | 
| friend class Isolate; | 
| #endif  // DEBUG | 
| }; | 
| @@ -98,12 +118,11 @@ class PerThreadAssertScope : public PerThreadAssertScopeBase { | 
| static void SetIsAllowed(bool is_allowed) { } | 
| #else | 
| PerThreadAssertScope() { | 
| -    PerThreadAssertData* data = AssertData(); | 
| -    old_state_ = data->get(type); | 
| -    data->set(type, allow); | 
| +    old_state_ = data_->get(type); | 
| +    data_->set(type, allow); | 
| } | 
|  | 
| -  ~PerThreadAssertScope() { AssertData()->set(type, old_state_); } | 
| +  ~PerThreadAssertScope() { data_->set(type, old_state_); } | 
|  | 
| static bool IsAllowed() { return AssertData()->get(type); } | 
|  | 
|  |