Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index 2e2aa8e08fe732e71d5f0bff868e23ac32b208a1..66d17fbe6501fe46acfeffb81b1c70afdb155688 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -699,6 +699,10 @@ void Heap::GarbageCollectionEpilogue() { |
ReportStatisticsAfterGC(); |
#endif // DEBUG |
isolate_->debug()->AfterGarbageCollection(); |
+ |
+ // Remember the last top pointer so that we can later find out |
+ // whether we allocated in new space since the last GC. |
+ new_space_top_after_last_gc_ = new_space()->top(); |
} |
@@ -4321,14 +4325,15 @@ STRUCT_LIST(MAKE_CASE) |
bool Heap::IsHeapIterable() { |
return (!old_pointer_space()->was_swept_conservatively() && |
- !old_data_space()->was_swept_conservatively()); |
+ !old_data_space()->was_swept_conservatively() && |
+ new_space_top_after_last_gc_ == new_space()->top()); |
} |
-void Heap::EnsureHeapIsIterable() { |
+void Heap::MakeHeapIterable() { |
ASSERT(AllowHeapAllocation::IsAllowed()); |
if (!IsHeapIterable()) { |
- CollectAllGarbage(kMakeHeapIterableMask, "Heap::EnsureHeapIsIterable"); |
+ CollectAllGarbage(kMakeHeapIterableMask, "Heap::MakeHeapIterable"); |
} |
ASSERT(IsHeapIterable()); |
} |
@@ -5208,6 +5213,7 @@ bool Heap::SetUp() { |
if (!new_space_.SetUp(reserved_semispace_size_, max_semi_space_size_)) { |
return false; |
} |
+ new_space_top_after_last_gc_ = new_space()->top(); |
// Initialize old pointer space. |
old_pointer_space_ = |
@@ -5731,7 +5737,9 @@ class UnreachableObjectsFilter : public HeapObjectsFilter { |
HeapIterator::HeapIterator(Heap* heap) |
- : heap_(heap), |
+ : make_heap_iterable_helper_(heap), |
+ no_heap_allocation_(), |
+ heap_(heap), |
filtering_(HeapIterator::kNoFiltering), |
filter_(NULL) { |
Init(); |
@@ -5740,7 +5748,9 @@ HeapIterator::HeapIterator(Heap* heap) |
HeapIterator::HeapIterator(Heap* heap, |
HeapIterator::HeapObjectsFiltering filtering) |
- : heap_(heap), |
+ : make_heap_iterable_helper_(heap), |
+ no_heap_allocation_(), |
+ heap_(heap), |
filtering_(filtering), |
filter_(NULL) { |
Init(); |