| Index: src/heap/spaces.h
|
| diff --git a/src/heap/spaces.h b/src/heap/spaces.h
|
| index de82164a1332be17c00c5f2c9e239a4284a1e1cb..b11f926fde3cf373b1144b0dc67ebc5f859c0a02 100644
|
| --- a/src/heap/spaces.h
|
| +++ b/src/heap/spaces.h
|
| @@ -541,23 +541,38 @@ class MemoryChunk {
|
| static const intptr_t kSizeOffset = 0;
|
|
|
| static const intptr_t kLiveBytesOffset =
|
| - kSizeOffset + kPointerSize + kPointerSize + kPointerSize + kPointerSize +
|
| - kPointerSize + kPointerSize + kPointerSize + kPointerSize + kIntSize;
|
| + kSizeOffset + kPointerSize // size_t size
|
| + + kIntptrSize // intptr_t flags_
|
| + + kPointerSize // Address area_start_
|
| + + kPointerSize // Address area_end_
|
| + + 2 * kPointerSize // base::VirtualMemory reservation_
|
| + + kPointerSize // Address owner_
|
| + + kPointerSize // Heap* heap_
|
| + + kIntSize; // int store_buffer_counter_
|
|
|
| - static const size_t kSlotsBufferOffset = kLiveBytesOffset + kIntSize;
|
| +
|
| + static const size_t kSlotsBufferOffset =
|
| + kLiveBytesOffset + kIntSize; // int live_byte_count_
|
|
|
| static const size_t kWriteBarrierCounterOffset =
|
| - kSlotsBufferOffset + kPointerSize + kPointerSize;
|
| -
|
| - static const size_t kHeaderSize = kWriteBarrierCounterOffset +
|
| - kPointerSize + // write_barrier_counter_
|
| - kIntSize + // progress_bar_
|
| - kIntSize + // high_water_mark_
|
| - kPointerSize + // mutex_ page lock
|
| - kPointerSize + // parallel_sweeping_
|
| - 5 * kPointerSize + // free list statistics
|
| - kPointerSize + // next_chunk_
|
| - kPointerSize; // prev_chunk_
|
| + kSlotsBufferOffset + kPointerSize // SlotsBuffer* slots_buffer_;
|
| + + kPointerSize; // SkipList* skip_list_;
|
| +
|
| + static const size_t kMinHeaderSize =
|
| + kWriteBarrierCounterOffset +
|
| + kIntptrSize // intptr_t write_barrier_counter_
|
| + + kIntSize // int progress_bar_
|
| + + kIntSize // int high_water_mark_
|
| + + kPointerSize // base::Mutex* mutex_
|
| + + kPointerSize // base::AtomicWord parallel_sweeping_
|
| + + 5 * kIntSize // int free-list statistics
|
| + + kPointerSize // base::AtomicWord next_chunk_
|
| + + kPointerSize; // base::AtomicWord prev_chunk_
|
| +
|
| + // We add some more space to the computed header size to amount for missing
|
| + // alignment requirements in our computation.
|
| + // Try to get kHeaderSize properly aligned on 32-bit and 64-bit machines.
|
| + static const size_t kHeaderSize = kMinHeaderSize + kIntSize;
|
|
|
| static const int kBodyOffset =
|
| CODE_POINTER_ALIGN(kHeaderSize + Bitmap::kSize);
|
| @@ -716,23 +731,21 @@ class MemoryChunk {
|
| int available_in_huge_free_list_;
|
| int non_available_small_blocks_;
|
|
|
| - static MemoryChunk* Initialize(Heap* heap, Address base, size_t size,
|
| - Address area_start, Address area_end,
|
| - Executability executable, Space* owner);
|
| -
|
| - private:
|
| // next_chunk_ holds a pointer of type MemoryChunk
|
| base::AtomicWord next_chunk_;
|
| // prev_chunk_ holds a pointer of type MemoryChunk
|
| base::AtomicWord prev_chunk_;
|
|
|
| + static MemoryChunk* Initialize(Heap* heap, Address base, size_t size,
|
| + Address area_start, Address area_end,
|
| + Executability executable, Space* owner);
|
| +
|
| + private:
|
| friend class MemoryAllocator;
|
| + friend class MemoryChunkValidator;
|
| };
|
|
|
|
|
| -STATIC_ASSERT(sizeof(MemoryChunk) <= MemoryChunk::kHeaderSize);
|
| -
|
| -
|
| // -----------------------------------------------------------------------------
|
| // A page is a memory chunk of a size 1MB. Large object pages may be larger.
|
| //
|
| @@ -841,9 +854,6 @@ class Page : public MemoryChunk {
|
| };
|
|
|
|
|
| -STATIC_ASSERT(sizeof(Page) <= MemoryChunk::kHeaderSize);
|
| -
|
| -
|
| class LargePage : public MemoryChunk {
|
| public:
|
| HeapObject* GetObject() { return HeapObject::FromAddress(area_start()); }
|
| @@ -860,7 +870,6 @@ class LargePage : public MemoryChunk {
|
| friend class MemoryAllocator;
|
| };
|
|
|
| -STATIC_ASSERT(sizeof(LargePage) <= MemoryChunk::kHeaderSize);
|
|
|
| // ----------------------------------------------------------------------------
|
| // Space is the abstract superclass for all allocation spaces.
|
| @@ -914,6 +923,23 @@ class Space : public Malloced {
|
| };
|
|
|
|
|
| +class MemoryChunkValidator {
|
| + // Computed offsets should match the compiler generated ones.
|
| + 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::kWriteBarrierCounterOffset ==
|
| + offsetof(MemoryChunk, write_barrier_counter_));
|
| +
|
| + // Validate our estimates on the header size.
|
| + STATIC_ASSERT(sizeof(MemoryChunk) <= MemoryChunk::kHeaderSize);
|
| + STATIC_ASSERT(sizeof(LargePage) <= MemoryChunk::kHeaderSize);
|
| + STATIC_ASSERT(sizeof(Page) <= MemoryChunk::kHeaderSize);
|
| +};
|
| +
|
| +
|
| // ----------------------------------------------------------------------------
|
| // All heap objects containing executable code (code objects) must be allocated
|
| // from a 2 GB range of memory, so that they can call each other using 32-bit
|
|
|