Index: src/spaces.h |
=================================================================== |
--- src/spaces.h (revision 2377) |
+++ src/spaces.h (working copy) |
@@ -1315,8 +1315,7 @@ |
private: |
// The size range of blocks, in bytes. (Smaller allocations are allowed, but |
// will always result in waste.) |
- static const int kMinBlockSize = |
- POINTER_SIZE_ALIGN(ByteArray::kHeaderSize) + kPointerSize; |
+ static const int kMinBlockSize = 2 * kPointerSize; |
static const int kMaxBlockSize = Page::kMaxHeapObjectSize; |
// The identity of the owning space, for building allocation Failure |
@@ -1391,9 +1390,9 @@ |
// The free list for the map space. |
-class MapSpaceFreeList BASE_EMBEDDED { |
+class FixedSizeFreeList BASE_EMBEDDED { |
public: |
- explicit MapSpaceFreeList(AllocationSpace owner); |
+ FixedSizeFreeList(AllocationSpace owner, int object_size); |
// Clear the free list. |
void Reset(); |
@@ -1402,12 +1401,12 @@ |
int available() { return available_; } |
// Place a node on the free list. The block starting at 'start' (assumed to |
- // have size Map::kSize) is placed on the free list. Bookkeeping |
+ // have size object_size_) is placed on the free list. Bookkeeping |
// information will be written to the block, ie, its contents will be |
// destroyed. The start address should be word aligned. |
void Free(Address start); |
- // Allocate a map-sized block from the free list. The block is unitialized. |
+ // Allocate a fixed sized block from the free list. The block is unitialized. |
// A failure is returned if no block is available. |
Object* Allocate(); |
@@ -1422,7 +1421,10 @@ |
// objects. |
AllocationSpace owner_; |
- DISALLOW_COPY_AND_ASSIGN(MapSpaceFreeList); |
+ // The size of the objects in this space. |
+ int object_size_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FixedSizeFreeList); |
}; |
@@ -1460,12 +1462,6 @@ |
// clears the free list. |
virtual void PrepareForMarkCompact(bool will_compact); |
- // Adjust the top of relocation pointer to point to the end of the object |
- // given by 'address' and 'size_in_bytes'. Move it to the next page if |
- // necessary, ensure that it points to the address, then increment it by the |
- // size. |
- void MCAdjustRelocationEnd(Address address, int size_in_bytes); |
- |
// Updates the allocation pointer to the relocation top after a mark-compact |
// collection. |
virtual void MCCommitRelocationInfo(); |
@@ -1492,39 +1488,40 @@ |
// The space's free list. |
OldSpaceFreeList free_list_; |
- // During relocation, we keep a pointer to the most recently relocated |
- // object in order to know when to move to the next page. |
- Address mc_end_of_relocation_; |
- |
public: |
TRACK_MEMORY("OldSpace") |
}; |
// ----------------------------------------------------------------------------- |
-// Old space for all map objects |
+// Old space for objects of a fixed size |
-class MapSpace : public PagedSpace { |
+class FixedSpace : public PagedSpace { |
public: |
- // Creates a map space object with a maximum capacity. |
- explicit MapSpace(int max_capacity, AllocationSpace id) |
- : PagedSpace(max_capacity, id, NOT_EXECUTABLE), free_list_(id) { } |
+ FixedSpace(int max_capacity, |
+ AllocationSpace id, |
+ int object_size_in_bytes, |
+ const char* name) |
+ : PagedSpace(max_capacity, id, NOT_EXECUTABLE), |
+ object_size_in_bytes_(object_size_in_bytes), |
+ name_(name), |
+ free_list_(id, object_size_in_bytes), |
+ page_extra_(Page::kObjectAreaSize % object_size_in_bytes) { } |
// The top of allocation in a page in this space. Undefined if page is unused. |
virtual Address PageAllocationTop(Page* page) { |
return page == TopPageOf(allocation_info_) ? top() |
- : page->ObjectAreaEnd() - kPageExtra; |
+ : page->ObjectAreaEnd() - page_extra_; |
} |
- // Give a map-sized block of memory to the space's free list. |
+ int object_size_in_bytes() { return object_size_in_bytes_; } |
+ |
+ // Give a fixed sized block of memory to the space's free list. |
void Free(Address start) { |
free_list_.Free(start); |
accounting_stats_.DeallocateBytes(Map::kSize); |
} |
- // Given an index, returns the page address. |
- Address PageAddress(int page_index) { return page_addresses_[page_index]; } |
- |
// Prepares for a mark-compact GC. |
virtual void PrepareForMarkCompact(bool will_compact); |
@@ -1536,18 +1533,16 @@ |
// Verify integrity of this space. |
virtual void Verify(); |
+ // Implement by subclasses to verify an actual object in the space. |
+ virtual void VerifyObject(HeapObject* obj) = 0; |
+ |
// Reports statistic info of the space |
void ReportStatistics(); |
+ |
// Dump the remembered sets in the space to stdout. |
void PrintRSet(); |
#endif |
- // Constants. |
- static const int kMapPageIndexBits = 10; |
- static const int kMaxMapPageIndex = (1 << kMapPageIndexBits) - 1; |
- |
- static const int kPageExtra = Page::kObjectAreaSize % Map::kSize; |
- |
protected: |
// Virtual function in the superclass. Slow path of AllocateRaw. |
HeapObject* SlowAllocateRaw(int size_in_bytes); |
@@ -1557,9 +1552,44 @@ |
HeapObject* AllocateInNextPage(Page* current_page, int size_in_bytes); |
private: |
+ // The size of objects in this space. |
+ int object_size_in_bytes_; |
+ |
+ // The name of this space. |
+ const char* name_; |
+ |
// The space's free list. |
- MapSpaceFreeList free_list_; |
+ FixedSizeFreeList free_list_; |
+ // Bytes of each page that cannot be allocated. |
+ int page_extra_; |
+}; |
+ |
+ |
+// ----------------------------------------------------------------------------- |
+// Old space for all map objects |
+ |
+class MapSpace : public FixedSpace { |
+ public: |
+ // Creates a map space object with a maximum capacity. |
+ MapSpace(int max_capacity, AllocationSpace id) |
+ : FixedSpace(max_capacity, id, Map::kSize, "map") {} |
+ |
+ // Prepares for a mark-compact GC. |
+ virtual void PrepareForMarkCompact(bool will_compact); |
+ |
+ // Given an index, returns the page address. |
+ Address PageAddress(int page_index) { return page_addresses_[page_index]; } |
+ |
+ // Constants. |
+ static const int kMaxMapPageIndex = (1 << MapWord::kMapPageIndexBits) - 1; |
+ |
+ protected: |
+#ifdef DEBUG |
+ virtual void VerifyObject(HeapObject* obj); |
+#endif |
+ |
+ private: |
// An array of page start address in a map space. |
Address page_addresses_[kMaxMapPageIndex + 1]; |
@@ -1569,6 +1599,25 @@ |
// ----------------------------------------------------------------------------- |
+// Old space for all global object property cell objects |
+ |
+class CellSpace : public FixedSpace { |
+ public: |
+ // Creates a property cell space object with a maximum capacity. |
+ CellSpace(int max_capacity, AllocationSpace id) |
+ : FixedSpace(max_capacity, id, JSGlobalPropertyCell::kSize, "cell") {} |
+ |
+ protected: |
+#ifdef DEBUG |
+ virtual void VerifyObject(HeapObject* obj); |
+#endif |
+ |
+ public: |
+ TRACK_MEMORY("MapSpace") |
+}; |
+ |
+ |
+// ----------------------------------------------------------------------------- |
// Large objects ( > Page::kMaxHeapObjectSize ) are allocated and managed by |
// the large object space. A large object is allocated from OS heap with |
// extra padding bytes (Page::kPageSize + Page::kObjectStartOffset). |