Index: src/heap/spaces.h |
diff --git a/src/heap/spaces.h b/src/heap/spaces.h |
index c0d399f94c5b63ae50a0665849a330a929b283f5..b940a21f4ecf4c1e23c8ff3f395086bda8d7a248 100644 |
--- a/src/heap/spaces.h |
+++ b/src/heap/spaces.h |
@@ -32,6 +32,7 @@ class SemiSpace; |
class SkipList; |
class SlotsBuffer; |
class SlotSet; |
+class TypedSlotSet; |
class Space; |
// ----------------------------------------------------------------------------- |
@@ -392,14 +393,14 @@ class MemoryChunk { |
+ kPointerSize // Heap* heap_ |
+ kIntSize; // int progress_bar_ |
- static const size_t kSlotsBufferOffset = |
+ static const size_t kOldToNewSlotsOffset = |
kLiveBytesOffset + kIntSize; // int live_byte_count_ |
static const size_t kWriteBarrierCounterOffset = |
- kSlotsBufferOffset + kPointerSize // SlotsBuffer* slots_buffer_; |
- + kPointerSize // SlotSet* old_to_new_slots_; |
- + kPointerSize // SlotSet* old_to_old_slots_; |
- + kPointerSize; // SkipList* skip_list_; |
+ kOldToNewSlotsOffset + kPointerSize // SlotSet* old_to_new_slots_; |
+ + kPointerSize // SlotSet* old_to_old_slots_; |
+ + kPointerSize // TypedSlotSet* typed_old_to_old_slots_; |
+ + kPointerSize; // SkipList* skip_list_; |
static const size_t kMinHeaderSize = |
kWriteBarrierCounterOffset + |
@@ -509,17 +510,18 @@ class MemoryChunk { |
inline void set_skip_list(SkipList* skip_list) { skip_list_ = skip_list; } |
- inline SlotsBuffer* slots_buffer() { return slots_buffer_; } |
- |
- inline SlotsBuffer** slots_buffer_address() { return &slots_buffer_; } |
- |
inline SlotSet* old_to_new_slots() { return old_to_new_slots_; } |
inline SlotSet* old_to_old_slots() { return old_to_old_slots_; } |
+ inline TypedSlotSet* typed_old_to_old_slots() { |
+ return typed_old_to_old_slots_; |
+ } |
void AllocateOldToNewSlots(); |
void ReleaseOldToNewSlots(); |
void AllocateOldToOldSlots(); |
void ReleaseOldToOldSlots(); |
+ void AllocateTypedOldToOldSlots(); |
+ void ReleaseTypedOldToOldSlots(); |
Address area_start() { return area_start_; } |
Address area_end() { return area_end_; } |
@@ -593,12 +595,14 @@ class MemoryChunk { |
void MarkEvacuationCandidate() { |
DCHECK(!IsFlagSet(NEVER_EVACUATE)); |
- DCHECK_NULL(slots_buffer_); |
+ DCHECK_NULL(old_to_old_slots_); |
+ DCHECK_NULL(typed_old_to_old_slots_); |
SetFlag(EVACUATION_CANDIDATE); |
} |
void ClearEvacuationCandidate() { |
- DCHECK(slots_buffer_ == NULL); |
+ DCHECK_NULL(old_to_old_slots_); |
+ DCHECK_NULL(typed_old_to_old_slots_); |
ClearFlag(EVACUATION_CANDIDATE); |
} |
@@ -683,13 +687,12 @@ class MemoryChunk { |
// Count of bytes marked black on page. |
int live_byte_count_; |
- SlotsBuffer* slots_buffer_; |
- |
// A single slot set for small pages (of size kPageSize) or an array of slot |
// set for large pages. In the latter case the number of entries in the array |
// is ceil(size() / kPageSize). |
SlotSet* old_to_new_slots_; |
SlotSet* old_to_old_slots_; |
+ TypedSlotSet* typed_old_to_old_slots_; |
SkipList* skip_list_; |
@@ -862,6 +865,12 @@ class LargePage : public MemoryChunk { |
inline void set_next_page(LargePage* page) { set_next_chunk(page); } |
+ // A limit to guarantee that we do not overflow typed slot offset in |
+ // the old to old remembered set. |
+ // Note that this limit is higher than what assembler already imposes on |
+ // x64 and ia32 architectures. |
+ static const int kMaxCodePageSize = 512 * MB; |
+ |
private: |
static inline LargePage* Initialize(Heap* heap, MemoryChunk* chunk); |
@@ -977,8 +986,8 @@ class MemoryChunkValidator { |
STATIC_ASSERT(MemoryChunk::kSizeOffset == offsetof(MemoryChunk, size_)); |
STATIC_ASSERT(MemoryChunk::kLiveBytesOffset == |
offsetof(MemoryChunk, live_byte_count_)); |
- STATIC_ASSERT(MemoryChunk::kSlotsBufferOffset == |
- offsetof(MemoryChunk, slots_buffer_)); |
+ STATIC_ASSERT(MemoryChunk::kOldToNewSlotsOffset == |
+ offsetof(MemoryChunk, old_to_new_slots_)); |
STATIC_ASSERT(MemoryChunk::kWriteBarrierCounterOffset == |
offsetof(MemoryChunk, write_barrier_counter_)); |
@@ -2988,25 +2997,42 @@ class LargeObjectIterator : public ObjectIterator { |
LargePage* current_; |
}; |
+class LargePageIterator BASE_EMBEDDED { |
+ public: |
+ explicit inline LargePageIterator(LargeObjectSpace* space); |
+ |
+ inline LargePage* next(); |
+ |
+ private: |
+ LargePage* next_page_; |
+}; |
// Iterates over the chunks (pages and large object pages) that can contain |
-// pointers to new space. |
-class PointerChunkIterator BASE_EMBEDDED { |
+// pointers to new space or to evacuation candidates. |
+class MemoryChunkIterator BASE_EMBEDDED { |
public: |
- inline explicit PointerChunkIterator(Heap* heap); |
+ enum Mode { ALL, ALL_BUT_MAP_SPACE, ALL_BUT_CODE_SPACE }; |
+ inline explicit MemoryChunkIterator(Heap* heap, Mode mode); |
// Return NULL when the iterator is done. |
inline MemoryChunk* next(); |
private: |
- enum State { kOldSpaceState, kMapState, kLargeObjectState, kFinishedState }; |
+ enum State { |
+ kOldSpaceState, |
+ kMapState, |
+ kCodeState, |
+ kLargeObjectState, |
+ kFinishedState |
+ }; |
State state_; |
+ const Mode mode_; |
PageIterator old_iterator_; |
+ PageIterator code_iterator_; |
PageIterator map_iterator_; |
- LargeObjectIterator lo_iterator_; |
+ LargePageIterator lo_iterator_; |
}; |
- |
#ifdef DEBUG |
struct CommentStatistic { |
const char* comment; |