Index: src/heap-inl.h |
diff --git a/src/heap-inl.h b/src/heap-inl.h |
index c065b73daa70354c5652b7775d1f46b671b2d6d4..33bc2c7cb5649d60a1c9bfe6e89146a9a0e8c945 100644 |
--- a/src/heap-inl.h |
+++ b/src/heap-inl.h |
@@ -40,12 +40,26 @@ namespace v8 { |
namespace internal { |
void PromotionQueue::insert(HeapObject* target, int size) { |
+ if (emergency_stack_ != NULL) { |
+ emergency_stack_->Add(Entry(target, size)); |
+ return; |
+ } |
+ |
if (NewSpacePage::IsAtStart(reinterpret_cast<Address>(rear_))) { |
NewSpacePage* rear_page = |
NewSpacePage::FromAddress(reinterpret_cast<Address>(rear_)); |
ASSERT(!rear_page->prev_page()->is_anchor()); |
rear_ = reinterpret_cast<intptr_t*>(rear_page->prev_page()->body_limit()); |
} |
+ |
+ Page* rear_page = Page::FromAddress(reinterpret_cast<Address>(rear_ - 2)); |
+ Page* limit_page = Page::FromAllocationTop(reinterpret_cast<Address>(limit_)); |
+ if (rear_page == limit_page && (rear_ - 2) < limit_) { |
+ RelocateQueueHead(); |
Erik Corry
2011/11/07 16:35:25
This one asserts that there is something to reloca
|
+ emergency_stack_->Add(Entry(target, size)); |
+ return; |
+ } |
+ |
*(--rear_) = reinterpret_cast<intptr_t>(target); |
*(--rear_) = size; |
// Assert no overflow into live objects. |