diff options
Diffstat (limited to 'Source/JavaScriptCore/heap/HeapBlock.h')
-rw-r--r-- | Source/JavaScriptCore/heap/HeapBlock.h | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/Source/JavaScriptCore/heap/HeapBlock.h b/Source/JavaScriptCore/heap/HeapBlock.h index 3cd3c6322..a63b7ebe1 100644 --- a/Source/JavaScriptCore/heap/HeapBlock.h +++ b/Source/JavaScriptCore/heap/HeapBlock.h @@ -34,22 +34,42 @@ namespace JSC { enum AllocationEffort { AllocationCanFail, AllocationMustSucceed }; -class HeapBlock : public DoublyLinkedListNode<HeapBlock> { +#if COMPILER(GCC) +#define CLASS_IF_GCC class +#else +#define CLASS_IF_GCC +#endif + +template<typename T> +class HeapBlock : public DoublyLinkedListNode<T> { + friend CLASS_IF_GCC DoublyLinkedListNode<T>; public: + static const size_t s_blockSize = 64 * KB; + + static PageAllocationAligned destroy(HeapBlock* block) + { + static_cast<T*>(block)->~T(); + + PageAllocationAligned allocation; + std::swap(allocation, block->m_allocation); + return allocation; + } + HeapBlock(const PageAllocationAligned& allocation) - : DoublyLinkedListNode<HeapBlock>() + : DoublyLinkedListNode<T>() + , m_allocation(allocation) , m_prev(0) , m_next(0) - , m_allocation(allocation) { ASSERT(m_allocation); } - HeapBlock* m_prev; - HeapBlock* m_next; + const PageAllocationAligned allocation() const { return m_allocation; } + +private: PageAllocationAligned m_allocation; - - static const size_t s_blockSize = 64 * KB; + T* m_prev; + T* m_next; }; } // namespace JSC |