| Index: src/spaces.h
|
| ===================================================================
|
| --- src/spaces.h (revision 5173)
|
| +++ src/spaces.h (working copy)
|
| @@ -197,6 +197,10 @@
|
|
|
| inline void SetIsLargeObjectPage(bool is_large_object_page);
|
|
|
| + inline bool IsPageExecutable();
|
| +
|
| + inline void SetIsPageExecutable(bool is_page_executable);
|
| +
|
| // Returns the offset of a given address to this page.
|
| INLINE(int Offset(Address a)) {
|
| int offset = static_cast<int>(a - address());
|
| @@ -256,13 +260,16 @@
|
| STATIC_CHECK(kRegionSize == kPageSize / kBitsPerInt);
|
|
|
| enum PageFlag {
|
| - IS_NORMAL_PAGE = 1 << 0,
|
| - WAS_IN_USE_BEFORE_MC = 1 << 1,
|
| + IS_NORMAL_PAGE = 0,
|
| + WAS_IN_USE_BEFORE_MC,
|
|
|
| // Page allocation watermark was bumped by preallocation during scavenge.
|
| // Correct watermark can be retrieved by CachedAllocationWatermark() method
|
| - WATERMARK_INVALIDATED = 1 << 2
|
| + WATERMARK_INVALIDATED,
|
| + IS_EXECUTABLE,
|
| + NUM_PAGE_FLAGS // Must be last
|
| };
|
| + static const int kPageFlagMask = (1 << NUM_PAGE_FLAGS) - 1;
|
|
|
| // To avoid an additional WATERMARK_INVALIDATED flag clearing pass during
|
| // scavenge we just invalidate the watermark on each old space page after
|
| @@ -291,7 +298,7 @@
|
|
|
| inline void ClearGCFields();
|
|
|
| - static const int kAllocationWatermarkOffsetShift = 3;
|
| + static const int kAllocationWatermarkOffsetShift = WATERMARK_INVALIDATED + 1;
|
| static const int kAllocationWatermarkOffsetBits = kPageSizeBits + 1;
|
| static const uint32_t kAllocationWatermarkOffsetMask =
|
| ((1 << kAllocationWatermarkOffsetBits) - 1) <<
|
| @@ -557,7 +564,9 @@
|
| static void* AllocateRawMemory(const size_t requested,
|
| size_t* allocated,
|
| Executability executable);
|
| - static void FreeRawMemory(void* buf, size_t length);
|
| + static void FreeRawMemory(void* buf,
|
| + size_t length,
|
| + Executability executable);
|
|
|
| // Returns the maximum available bytes of heaps.
|
| static int Available() { return capacity_ < size_ ? 0 : capacity_ - size_; }
|
| @@ -565,6 +574,9 @@
|
| // Returns allocated spaces in bytes.
|
| static int Size() { return size_; }
|
|
|
| + // Returns allocated executable spaces in bytes.
|
| + static int SizeExecutable() { return size_executable_; }
|
| +
|
| // Returns maximum available bytes that the old space can have.
|
| static int MaxAvailable() {
|
| return (Available() / Page::kPageSize) * Page::kObjectAreaSize;
|
| @@ -628,6 +640,8 @@
|
|
|
| // Allocated space size in bytes.
|
| static int size_;
|
| + // Allocated executable space size in bytes.
|
| + static int size_executable_;
|
|
|
| // The initial chunk of virtual memory.
|
| static VirtualMemory* initial_chunk_;
|
| @@ -2058,7 +2072,7 @@
|
| LargeObjectChunk* next() { return next_; }
|
| void set_next(LargeObjectChunk* chunk) { next_ = chunk; }
|
|
|
| - size_t size() { return size_; }
|
| + size_t size() { return size_ & ~Page::kPageFlagMask; }
|
| void set_size(size_t size_in_bytes) { size_ = size_in_bytes; }
|
|
|
| // Returns the object in this chunk.
|
|
|