| Index: src/api.h | 
| diff --git a/src/api.h b/src/api.h | 
| index e179e35672ff69bfcb84333c33f0c11a3e557b96..e36160cf4ab9e60102229030b43d317bc8cdc0e7 100644 | 
| --- a/src/api.h | 
| +++ b/src/api.h | 
| @@ -353,7 +353,7 @@ class HandleScopeImplementer { | 
|  | 
|  | 
| inline internal::Object** GetSpareOrNewBlock(); | 
| -  inline void DeleteExtensions(int extensions); | 
| +  inline void DeleteExtensions(internal::Object** prev_limit); | 
|  | 
| inline void IncrementCallDepth() {call_depth_++;} | 
| inline void DecrementCallDepth() {call_depth_--;} | 
| @@ -465,25 +465,28 @@ internal::Object** HandleScopeImplementer::GetSpareOrNewBlock() { | 
| } | 
|  | 
|  | 
| -void HandleScopeImplementer::DeleteExtensions(int extensions) { | 
| -  if (spare_ != NULL) { | 
| -    DeleteArray(spare_); | 
| -    spare_ = NULL; | 
| -  } | 
| -  for (int i = extensions; i > 1; --i) { | 
| -    internal::Object** block = blocks_.RemoveLast(); | 
| +void HandleScopeImplementer::DeleteExtensions(internal::Object** prev_limit) { | 
| +  while (!blocks_.is_empty()) { | 
| +    internal::Object** block_start = blocks_.last(); | 
| +    internal::Object** block_limit = block_start + kHandleBlockSize; | 
| #ifdef DEBUG | 
| -    v8::ImplementationUtilities::ZapHandleRange(block, | 
| -                                                &block[kHandleBlockSize]); | 
| +    // NoHandleAllocation may make the prev_limit to point inside the block. | 
| +    if (block_start <= prev_limit && prev_limit <= block_limit) break; | 
| +#else | 
| +    if (prev_limit == block_limit) break; | 
| #endif | 
| -    DeleteArray(block); | 
| -  } | 
| -  spare_ = blocks_.RemoveLast(); | 
| + | 
| +    blocks_.RemoveLast(); | 
| #ifdef DEBUG | 
| -  v8::ImplementationUtilities::ZapHandleRange( | 
| -      spare_, | 
| -      &spare_[kHandleBlockSize]); | 
| +    v8::ImplementationUtilities::ZapHandleRange(block_start, block_limit); | 
| #endif | 
| +    if (spare_ != NULL) { | 
| +      DeleteArray(spare_); | 
| +    } | 
| +    spare_ = block_start; | 
| +  } | 
| +  ASSERT((blocks_.is_empty() && prev_limit == NULL) || | 
| +         (!blocks_.is_empty() && prev_limit != NULL)); | 
| } | 
|  | 
| } }  // namespace v8::internal | 
|  |