| Index: src/heap/heap.h
|
| diff --git a/src/heap/heap.h b/src/heap/heap.h
|
| index 2e1594e52300d1234c6adcff2d64d8feeff7f0c7..12ae76583d35d72870a155eb85d4762eef5af202 100644
|
| --- a/src/heap/heap.h
|
| +++ b/src/heap/heap.h
|
| @@ -541,6 +541,9 @@
|
| static const int kAbortIncrementalMarkingMask = 2;
|
| static const int kFinalizeIncrementalMarkingMask = 4;
|
|
|
| + // Making the heap iterable requires us to abort incremental marking.
|
| + static const int kMakeHeapIterableMask = kAbortIncrementalMarkingMask;
|
| +
|
| // The roots that have an index less than this are always in old space.
|
| static const int kOldSpaceRoots = 0x20;
|
|
|
| @@ -660,6 +663,9 @@
|
|
|
| // Converts the given boolean condition to JavaScript boolean value.
|
| inline Oddball* ToBoolean(bool condition);
|
| +
|
| + // Check whether the heap is currently iterable.
|
| + bool IsHeapIterable();
|
|
|
| // Notify the heap that a context has been disposed.
|
| int NotifyContextDisposed(bool dependant_context);
|
| @@ -1027,7 +1033,9 @@
|
| AllocationSpace space, const char* gc_reason = NULL,
|
| const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
|
|
|
| - // Performs a full garbage collection.
|
| + // Performs a full garbage collection. If (flags & kMakeHeapIterableMask) is
|
| + // non-zero, then the slower precise sweeper is used, which leaves the heap
|
| + // in a state where we can iterate over the heap visiting all objects.
|
| void CollectAllGarbage(
|
| int flags = kFinalizeIncrementalMarkingMask, const char* gc_reason = NULL,
|
| const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
|
| @@ -1529,7 +1537,7 @@
|
| void EnsureFillerObjectAtTop();
|
|
|
| // Ensure that we have swept all spaces in such a way that we can iterate
|
| - // over all objects.
|
| + // over all objects. May cause a GC.
|
| void MakeHeapIterable();
|
|
|
| // Performs garbage collection operation.
|
| @@ -2368,7 +2376,6 @@
|
| ObjectIterator* iterator_; // object iterator for the current space.
|
| };
|
|
|
| -enum class HeapObjectsFiltering { kNoFiltering, kFilterUnreachable };
|
|
|
| // A HeapIterator provides iteration over the whole heap. It
|
| // aggregates the specific iterators for the different spaces as
|
| @@ -2384,16 +2391,31 @@
|
| // as this will leave heap objects marked (and thus, unusable).
|
| class HeapIterator BASE_EMBEDDED {
|
| public:
|
| - explicit HeapIterator(Heap* heap, HeapObjectsFiltering filtering =
|
| - HeapObjectsFiltering::kNoFiltering);
|
| + enum HeapObjectsFiltering { kNoFiltering, kFilterUnreachable };
|
| +
|
| + explicit HeapIterator(Heap* heap,
|
| + HeapObjectsFiltering filtering = kNoFiltering);
|
| ~HeapIterator();
|
|
|
| HeapObject* next();
|
|
|
| private:
|
| - DisallowHeapAllocation* disallow_heap_allocation_;
|
| + struct MakeHeapIterableHelper {
|
| + explicit MakeHeapIterableHelper(Heap* heap) { heap->MakeHeapIterable(); }
|
| + };
|
| +
|
| + HeapObject* NextObject();
|
| +
|
| + // The following two fields need to be declared in this order. Initialization
|
| + // order guarantees that we first make the heap iterable (which may involve
|
| + // allocations) and only then lock it down by not allowing further
|
| + // allocations.
|
| + MakeHeapIterableHelper make_heap_iterable_helper_;
|
| + DisallowHeapAllocation no_heap_allocation_;
|
|
|
| Heap* heap_;
|
| + HeapObjectsFiltering filtering_;
|
| + HeapObjectsFilter* filter_;
|
| // Space iterator for iterating all the spaces.
|
| SpaceIterator* space_iterator_;
|
| // Object iterator for the space currently being iterated.
|
|
|