| Index: src/handles.cc | 
| diff --git a/src/handles.cc b/src/handles.cc | 
| index def1604ac7438c5769a0cb6287fd009dee54758d..1962e2f651b1a11cf11f5cf4fb187aabaddfa612 100644 | 
| --- a/src/handles.cc | 
| +++ b/src/handles.cc | 
| @@ -958,4 +958,45 @@ int Utf8Length(Handle<String> str) { | 
| return len; | 
| } | 
|  | 
| + | 
| +DeferredHandleScope::DeferredHandleScope(Isolate* isolate) | 
| +    : impl_(isolate->handle_scope_implementer()) { | 
| +  impl_->BeginDeferredScope(); | 
| +  Object** new_next = impl_->GetSpareOrNewBlock(); | 
| +  Object** new_limit = &new_next[kHandleBlockSize]; | 
| +  impl_->blocks()->Add(new_next); | 
| + | 
| +  v8::ImplementationUtilities::HandleScopeData* data = | 
| +      impl_->isolate()->handle_scope_data(); | 
| +#ifdef DEBUG | 
| +  prev_level_ = data->level; | 
| +#endif | 
| +  data->level++; | 
| +  prev_limit_ = data->limit; | 
| +  prev_next_ = data->next; | 
| +  data->next = new_next; | 
| +  data->limit = new_limit; | 
| +} | 
| + | 
| + | 
| +DeferredHandleScope::~DeferredHandleScope() { | 
| +  impl_->isolate()->handle_scope_data()->level--; | 
| +  ASSERT(handles_detached_); | 
| +  ASSERT(impl_->isolate()->handle_scope_data()->level == prev_level_); | 
| +} | 
| + | 
| + | 
| +DeferredHandles* DeferredHandleScope::Detach() { | 
| +  DeferredHandles* deferred = impl_->Detach(prev_limit_); | 
| +  v8::ImplementationUtilities::HandleScopeData* data = | 
| +      impl_->isolate()->handle_scope_data(); | 
| +  data->next = prev_next_; | 
| +  data->limit = prev_limit_; | 
| +#ifdef DEBUG | 
| +  handles_detached_ = true; | 
| +#endif | 
| +  return deferred; | 
| +} | 
| + | 
| + | 
| } }  // namespace v8::internal | 
|  |