OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HEAP_SPACES_H_ | 5 #ifndef V8_HEAP_SPACES_H_ |
6 #define V8_HEAP_SPACES_H_ | 6 #define V8_HEAP_SPACES_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/atomic-utils.h" | 9 #include "src/atomic-utils.h" |
10 #include "src/base/atomicops.h" | 10 #include "src/base/atomicops.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 | 99 |
100 #define DCHECK_OBJECT_SIZE(size) \ | 100 #define DCHECK_OBJECT_SIZE(size) \ |
101 DCHECK((0 < size) && (size <= Page::kMaxRegularHeapObjectSize)) | 101 DCHECK((0 < size) && (size <= Page::kMaxRegularHeapObjectSize)) |
102 | 102 |
103 #define DCHECK_CODEOBJECT_SIZE(size, code_space) \ | 103 #define DCHECK_CODEOBJECT_SIZE(size, code_space) \ |
104 DCHECK((0 < size) && (size <= code_space->AreaSize())) | 104 DCHECK((0 < size) && (size <= code_space->AreaSize())) |
105 | 105 |
106 #define DCHECK_PAGE_OFFSET(offset) \ | 106 #define DCHECK_PAGE_OFFSET(offset) \ |
107 DCHECK((Page::kObjectStartOffset <= offset) && (offset <= Page::kPageSize)) | 107 DCHECK((Page::kObjectStartOffset <= offset) && (offset <= Page::kPageSize)) |
108 | 108 |
109 #define DCHECK_MAP_PAGE_INDEX(index) \ | |
110 DCHECK((0 <= index) && (index <= MapSpace::kMaxMapPageIndex)) | |
111 | |
112 | |
113 class MarkBit { | 109 class MarkBit { |
114 public: | 110 public: |
115 typedef uint32_t CellType; | 111 typedef uint32_t CellType; |
116 | 112 |
117 inline MarkBit(CellType* cell, CellType mask) : cell_(cell), mask_(mask) {} | 113 inline MarkBit(CellType* cell, CellType mask) : cell_(cell), mask_(mask) {} |
118 | 114 |
119 #ifdef DEBUG | 115 #ifdef DEBUG |
120 bool operator==(const MarkBit& other) { | 116 bool operator==(const MarkBit& other) { |
121 return cell_ == other.cell_ && mask_ == other.mask_; | 117 return cell_ == other.cell_ && mask_ == other.mask_; |
122 } | 118 } |
(...skipping 2735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2858 (info).limit() <= (space).page_high()) | 2854 (info).limit() <= (space).page_high()) |
2859 | 2855 |
2860 | 2856 |
2861 // ----------------------------------------------------------------------------- | 2857 // ----------------------------------------------------------------------------- |
2862 // Old space for all map objects | 2858 // Old space for all map objects |
2863 | 2859 |
2864 class MapSpace : public PagedSpace { | 2860 class MapSpace : public PagedSpace { |
2865 public: | 2861 public: |
2866 // Creates a map space object. | 2862 // Creates a map space object. |
2867 MapSpace(Heap* heap, AllocationSpace id) | 2863 MapSpace(Heap* heap, AllocationSpace id) |
2868 : PagedSpace(heap, id, NOT_EXECUTABLE), | 2864 : PagedSpace(heap, id, NOT_EXECUTABLE) {} |
2869 max_map_space_pages_(kMaxMapPageIndex - 1) {} | |
2870 | |
2871 // Given an index, returns the page address. | |
2872 // TODO(1600): this limit is artifical just to keep code compilable | |
2873 static const int kMaxMapPageIndex = 1 << 16; | |
2874 | 2865 |
2875 int RoundSizeDownToObjectAlignment(int size) override { | 2866 int RoundSizeDownToObjectAlignment(int size) override { |
2876 if (base::bits::IsPowerOfTwo32(Map::kSize)) { | 2867 if (base::bits::IsPowerOfTwo32(Map::kSize)) { |
2877 return RoundDown(size, Map::kSize); | 2868 return RoundDown(size, Map::kSize); |
2878 } else { | 2869 } else { |
2879 return (size / Map::kSize) * Map::kSize; | 2870 return (size / Map::kSize) * Map::kSize; |
2880 } | 2871 } |
2881 } | 2872 } |
2882 | 2873 |
2883 #ifdef VERIFY_HEAP | 2874 #ifdef VERIFY_HEAP |
2884 void VerifyObject(HeapObject* obj) override; | 2875 void VerifyObject(HeapObject* obj) override; |
2885 #endif | 2876 #endif |
2886 | |
2887 private: | |
2888 static const int kMapsPerPage = Page::kAllocatableMemory / Map::kSize; | |
2889 | |
2890 // Do map space compaction if there is a page gap. | |
2891 int CompactionThreshold() { | |
2892 return kMapsPerPage * (max_map_space_pages_ - 1); | |
2893 } | |
2894 | |
2895 const int max_map_space_pages_; | |
2896 }; | 2877 }; |
2897 | 2878 |
2898 | 2879 |
2899 // ----------------------------------------------------------------------------- | 2880 // ----------------------------------------------------------------------------- |
2900 // Large objects ( > Page::kMaxRegularHeapObjectSize ) are allocated and | 2881 // Large objects ( > Page::kMaxRegularHeapObjectSize ) are allocated and |
2901 // managed by the large object space. A large object is allocated from OS | 2882 // managed by the large object space. A large object is allocated from OS |
2902 // heap with extra padding bytes (Page::kPageSize + Page::kObjectStartOffset). | 2883 // heap with extra padding bytes (Page::kPageSize + Page::kObjectStartOffset). |
2903 // A large object always starts at Page::kObjectStartOffset to a page. | 2884 // A large object always starts at Page::kObjectStartOffset to a page. |
2904 // Large objects do not move during garbage collections. | 2885 // Large objects do not move during garbage collections. |
2905 | 2886 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3044 count = 0; | 3025 count = 0; |
3045 } | 3026 } |
3046 // Must be small, since an iteration is used for lookup. | 3027 // Must be small, since an iteration is used for lookup. |
3047 static const int kMaxComments = 64; | 3028 static const int kMaxComments = 64; |
3048 }; | 3029 }; |
3049 #endif | 3030 #endif |
3050 } // namespace internal | 3031 } // namespace internal |
3051 } // namespace v8 | 3032 } // namespace v8 |
3052 | 3033 |
3053 #endif // V8_HEAP_SPACES_H_ | 3034 #endif // V8_HEAP_SPACES_H_ |
OLD | NEW |