| OLD | NEW | 
|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 115   v8::ImplementationUtilities::HandleScopeData* current = | 115   v8::ImplementationUtilities::HandleScopeData* current = | 
| 116       isolate->handle_scope_data(); | 116       isolate->handle_scope_data(); | 
| 117   isolate_ = isolate; | 117   isolate_ = isolate; | 
| 118   prev_next_ = current->next; | 118   prev_next_ = current->next; | 
| 119   prev_limit_ = current->limit; | 119   prev_limit_ = current->limit; | 
| 120   current->level++; | 120   current->level++; | 
| 121 } | 121 } | 
| 122 | 122 | 
| 123 | 123 | 
| 124 HandleScope::~HandleScope() { | 124 HandleScope::~HandleScope() { | 
| 125   CloseScope(); | 125   CloseScope(isolate_, prev_next_, prev_limit_); | 
| 126 } | 126 } | 
| 127 | 127 | 
| 128 void HandleScope::CloseScope() { | 128 | 
|  | 129 void HandleScope::CloseScope(Isolate* isolate, | 
|  | 130                              Object** prev_next, | 
|  | 131                              Object** prev_limit) { | 
| 129   v8::ImplementationUtilities::HandleScopeData* current = | 132   v8::ImplementationUtilities::HandleScopeData* current = | 
| 130       isolate_->handle_scope_data(); | 133       isolate->handle_scope_data(); | 
| 131   current->next = prev_next_; | 134 | 
|  | 135   current->next = prev_next; | 
| 132   current->level--; | 136   current->level--; | 
| 133   if (current->limit != prev_limit_) { | 137   if (current->limit != prev_limit) { | 
| 134     current->limit = prev_limit_; | 138     current->limit = prev_limit; | 
| 135     DeleteExtensions(isolate_); | 139     DeleteExtensions(isolate); | 
| 136   } | 140   } | 
|  | 141 | 
| 137 #ifdef ENABLE_EXTRA_CHECKS | 142 #ifdef ENABLE_EXTRA_CHECKS | 
| 138   ZapRange(prev_next_, prev_limit_); | 143   ZapRange(prev_next, prev_limit); | 
| 139 #endif | 144 #endif | 
| 140 } | 145 } | 
| 141 | 146 | 
| 142 | 147 | 
| 143 template <typename T> | 148 template <typename T> | 
| 144 Handle<T> HandleScope::CloseAndEscape(Handle<T> handle_value) { | 149 Handle<T> HandleScope::CloseAndEscape(Handle<T> handle_value) { | 
|  | 150   v8::ImplementationUtilities::HandleScopeData* current = | 
|  | 151       isolate_->handle_scope_data(); | 
|  | 152 | 
| 145   T* value = *handle_value; | 153   T* value = *handle_value; | 
| 146   // Throw away all handles in the current scope. | 154   // Throw away all handles in the current scope. | 
| 147   CloseScope(); | 155   CloseScope(isolate_, prev_next_, prev_limit_); | 
| 148   v8::ImplementationUtilities::HandleScopeData* current = |  | 
| 149       isolate_->handle_scope_data(); |  | 
| 150   // Allocate one handle in the parent scope. | 156   // Allocate one handle in the parent scope. | 
| 151   ASSERT(current->level > 0); | 157   ASSERT(current->level > 0); | 
| 152   Handle<T> result(CreateHandle<T>(isolate_, value)); | 158   Handle<T> result(CreateHandle<T>(isolate_, value)); | 
| 153   // Reinitialize the current scope (so that it's ready | 159   // Reinitialize the current scope (so that it's ready | 
| 154   // to be used or closed again). | 160   // to be used or closed again). | 
| 155   prev_next_ = current->next; | 161   prev_next_ = current->next; | 
| 156   prev_limit_ = current->limit; | 162   prev_limit_ = current->limit; | 
| 157   current->level++; | 163   current->level++; | 
| 158   return result; | 164   return result; | 
| 159 } | 165 } | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 173 | 179 | 
| 174   T** result = reinterpret_cast<T**>(cur); | 180   T** result = reinterpret_cast<T**>(cur); | 
| 175   *result = value; | 181   *result = value; | 
| 176   return result; | 182   return result; | 
| 177 } | 183 } | 
| 178 | 184 | 
| 179 | 185 | 
| 180 #ifdef DEBUG | 186 #ifdef DEBUG | 
| 181 inline NoHandleAllocation::NoHandleAllocation(Isolate* isolate) | 187 inline NoHandleAllocation::NoHandleAllocation(Isolate* isolate) | 
| 182     : isolate_(isolate) { | 188     : isolate_(isolate) { | 
| 183   v8::ImplementationUtilities::HandleScopeData* current = |  | 
| 184       isolate_->handle_scope_data(); |  | 
| 185 |  | 
| 186   active_ = !isolate->optimizing_compiler_thread()->IsOptimizerThread(); | 189   active_ = !isolate->optimizing_compiler_thread()->IsOptimizerThread(); | 
| 187   if (active_) { | 190   if (active_) { | 
| 188     // Shrink the current handle scope to make it impossible to do | 191     // Shrink the current handle scope to make it impossible to do | 
| 189     // handle allocations without an explicit handle scope. | 192     // handle allocations without an explicit handle scope. | 
|  | 193     v8::ImplementationUtilities::HandleScopeData* current = | 
|  | 194         isolate_->handle_scope_data(); | 
|  | 195     limit_ = current->limit; | 
| 190     current->limit = current->next; | 196     current->limit = current->next; | 
| 191 |  | 
| 192     level_ = current->level; | 197     level_ = current->level; | 
| 193     current->level = 0; | 198     current->level = 0; | 
| 194   } | 199   } | 
| 195 } | 200 } | 
| 196 | 201 | 
| 197 | 202 | 
| 198 inline NoHandleAllocation::~NoHandleAllocation() { | 203 inline NoHandleAllocation::~NoHandleAllocation() { | 
| 199   if (active_) { | 204   if (active_) { | 
| 200     // Restore state in current handle scope to re-enable handle | 205     // Restore state in current handle scope to re-enable handle | 
| 201     // allocations. | 206     // allocations. | 
| 202     v8::ImplementationUtilities::HandleScopeData* data = | 207     v8::ImplementationUtilities::HandleScopeData* current = | 
| 203         isolate_->handle_scope_data(); | 208         isolate_->handle_scope_data(); | 
| 204     ASSERT_EQ(0, data->level); | 209     ASSERT_EQ(0, current->level); | 
| 205     data->level = level_; | 210     current->level = level_; | 
|  | 211     ASSERT_EQ(current->next, current->limit); | 
|  | 212     current->limit = limit_; | 
| 206   } | 213   } | 
| 207 } | 214 } | 
| 208 | 215 | 
| 209 | 216 | 
| 210 HandleDereferenceGuard::HandleDereferenceGuard(Isolate* isolate, State state) | 217 HandleDereferenceGuard::HandleDereferenceGuard(Isolate* isolate, State state) | 
| 211     : isolate_(isolate) { | 218     : isolate_(isolate) { | 
| 212   old_state_ = isolate_->HandleDereferenceGuardState(); | 219   old_state_ = isolate_->HandleDereferenceGuardState(); | 
| 213   isolate_->SetHandleDereferenceGuardState(state); | 220   isolate_->SetHandleDereferenceGuardState(state); | 
| 214 } | 221 } | 
| 215 | 222 | 
| 216 | 223 | 
| 217 HandleDereferenceGuard::~HandleDereferenceGuard() { | 224 HandleDereferenceGuard::~HandleDereferenceGuard() { | 
| 218   isolate_->SetHandleDereferenceGuardState(old_state_); | 225   isolate_->SetHandleDereferenceGuardState(old_state_); | 
| 219 } | 226 } | 
| 220 | 227 | 
| 221 #endif | 228 #endif | 
| 222 | 229 | 
| 223 } }  // namespace v8::internal | 230 } }  // namespace v8::internal | 
| 224 | 231 | 
| 225 #endif  // V8_HANDLES_INL_H_ | 232 #endif  // V8_HANDLES_INL_H_ | 
| OLD | NEW | 
|---|