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 |