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/base/atomicops.h" | 9 #include "src/base/atomicops.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 // | 1233 // |
1234 // A HeapObjectIterator iterates objects from the bottom of the given space | 1234 // A HeapObjectIterator iterates objects from the bottom of the given space |
1235 // to its top or from the bottom of the given page to its top. | 1235 // to its top or from the bottom of the given page to its top. |
1236 // | 1236 // |
1237 // If objects are allocated in the page during iteration the iterator may | 1237 // If objects are allocated in the page during iteration the iterator may |
1238 // or may not iterate over those objects. The caller must create a new | 1238 // or may not iterate over those objects. The caller must create a new |
1239 // iterator in order to be sure to visit these new objects. | 1239 // iterator in order to be sure to visit these new objects. |
1240 class HeapObjectIterator : public ObjectIterator { | 1240 class HeapObjectIterator : public ObjectIterator { |
1241 public: | 1241 public: |
1242 // Creates a new object iterator in a given space. | 1242 // Creates a new object iterator in a given space. |
1243 // If the size function is not given, the iterator calls the default | |
1244 // Object::Size(). | |
1245 explicit HeapObjectIterator(PagedSpace* space); | 1243 explicit HeapObjectIterator(PagedSpace* space); |
1246 HeapObjectIterator(PagedSpace* space, HeapObjectCallback size_func); | 1244 explicit HeapObjectIterator(Page* page); |
1247 HeapObjectIterator(Page* page, HeapObjectCallback size_func); | |
1248 | 1245 |
1249 // Advance to the next object, skipping free spaces and other fillers and | 1246 // Advance to the next object, skipping free spaces and other fillers and |
1250 // skipping the special garbage section of which there is one per space. | 1247 // skipping the special garbage section of which there is one per space. |
1251 // Returns NULL when the iteration has ended. | 1248 // Returns NULL when the iteration has ended. |
1252 inline HeapObject* Next() { | 1249 inline HeapObject* Next() { |
1253 do { | 1250 do { |
1254 HeapObject* next_obj = FromCurrentPage(); | 1251 HeapObject* next_obj = FromCurrentPage(); |
1255 if (next_obj != NULL) return next_obj; | 1252 if (next_obj != NULL) return next_obj; |
1256 } while (AdvanceToNextPage()); | 1253 } while (AdvanceToNextPage()); |
1257 return NULL; | 1254 return NULL; |
1258 } | 1255 } |
1259 | 1256 |
1260 virtual HeapObject* next_object() { return Next(); } | 1257 virtual HeapObject* next_object() { return Next(); } |
1261 | 1258 |
1262 private: | 1259 private: |
1263 enum PageMode { kOnePageOnly, kAllPagesInSpace }; | 1260 enum PageMode { kOnePageOnly, kAllPagesInSpace }; |
1264 | 1261 |
1265 Address cur_addr_; // Current iteration point. | 1262 Address cur_addr_; // Current iteration point. |
1266 Address cur_end_; // End iteration point. | 1263 Address cur_end_; // End iteration point. |
1267 HeapObjectCallback size_func_; // Size function or NULL. | |
1268 PagedSpace* space_; | 1264 PagedSpace* space_; |
1269 PageMode page_mode_; | 1265 PageMode page_mode_; |
1270 | 1266 |
1271 // Fast (inlined) path of next(). | 1267 // Fast (inlined) path of next(). |
1272 inline HeapObject* FromCurrentPage(); | 1268 inline HeapObject* FromCurrentPage(); |
1273 | 1269 |
1274 // Slow path of next(), goes into the next page. Returns false if the | 1270 // Slow path of next(), goes into the next page. Returns false if the |
1275 // iteration has ended. | 1271 // iteration has ended. |
1276 bool AdvanceToNextPage(); | 1272 bool AdvanceToNextPage(); |
1277 | 1273 |
1278 // Initializes fields. | 1274 // Initializes fields. |
1279 inline void Initialize(PagedSpace* owner, Address start, Address end, | 1275 inline void Initialize(PagedSpace* owner, Address start, Address end, |
1280 PageMode mode, HeapObjectCallback size_func); | 1276 PageMode mode); |
1281 }; | 1277 }; |
1282 | 1278 |
1283 | 1279 |
1284 // ----------------------------------------------------------------------------- | 1280 // ----------------------------------------------------------------------------- |
1285 // A PageIterator iterates the pages in a paged space. | 1281 // A PageIterator iterates the pages in a paged space. |
1286 | 1282 |
1287 class PageIterator BASE_EMBEDDED { | 1283 class PageIterator BASE_EMBEDDED { |
1288 public: | 1284 public: |
1289 explicit inline PageIterator(PagedSpace* space); | 1285 explicit inline PageIterator(PagedSpace* space); |
1290 | 1286 |
(...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2272 | 2268 |
2273 | 2269 |
2274 // A SemiSpaceIterator is an ObjectIterator that iterates over the active | 2270 // A SemiSpaceIterator is an ObjectIterator that iterates over the active |
2275 // semispace of the heap's new space. It iterates over the objects in the | 2271 // semispace of the heap's new space. It iterates over the objects in the |
2276 // semispace from a given start address (defaulting to the bottom of the | 2272 // semispace from a given start address (defaulting to the bottom of the |
2277 // semispace) to the top of the semispace. New objects allocated after the | 2273 // semispace) to the top of the semispace. New objects allocated after the |
2278 // iterator is created are not iterated. | 2274 // iterator is created are not iterated. |
2279 class SemiSpaceIterator : public ObjectIterator { | 2275 class SemiSpaceIterator : public ObjectIterator { |
2280 public: | 2276 public: |
2281 // Create an iterator over the objects in the given space. If no start | 2277 // Create an iterator over the objects in the given space. If no start |
2282 // address is given, the iterator starts from the bottom of the space. If | 2278 // address is given, the iterator starts from the bottom of the space. |
2283 // no size function is given, the iterator calls Object::Size(). | |
2284 | 2279 |
2285 // Iterate over all of allocated to-space. | 2280 // Iterate over all of allocated to-space. |
2286 explicit SemiSpaceIterator(NewSpace* space); | 2281 explicit SemiSpaceIterator(NewSpace* space); |
2287 // Iterate over all of allocated to-space, with a custome size function. | |
2288 SemiSpaceIterator(NewSpace* space, HeapObjectCallback size_func); | |
2289 // Iterate over part of allocated to-space, from start to the end | 2282 // Iterate over part of allocated to-space, from start to the end |
2290 // of allocation. | 2283 // of allocation. |
2291 SemiSpaceIterator(NewSpace* space, Address start); | 2284 SemiSpaceIterator(NewSpace* space, Address start); |
2292 // Iterate from one address to another in the same semi-space. | 2285 // Iterate from one address to another in the same semi-space. |
2293 SemiSpaceIterator(Address from, Address to); | 2286 SemiSpaceIterator(Address from, Address to); |
2294 | 2287 |
2295 HeapObject* Next() { | 2288 HeapObject* Next() { |
2296 if (current_ == limit_) return NULL; | 2289 if (current_ == limit_) return NULL; |
2297 if (NewSpacePage::IsAtEnd(current_)) { | 2290 if (NewSpacePage::IsAtEnd(current_)) { |
2298 NewSpacePage* page = NewSpacePage::FromLimit(current_); | 2291 NewSpacePage* page = NewSpacePage::FromLimit(current_); |
2299 page = page->next_page(); | 2292 page = page->next_page(); |
2300 DCHECK(!page->is_anchor()); | 2293 DCHECK(!page->is_anchor()); |
2301 current_ = page->area_start(); | 2294 current_ = page->area_start(); |
2302 if (current_ == limit_) return NULL; | 2295 if (current_ == limit_) return NULL; |
2303 } | 2296 } |
2304 | 2297 |
2305 HeapObject* object = HeapObject::FromAddress(current_); | 2298 HeapObject* object = HeapObject::FromAddress(current_); |
2306 int size = (size_func_ == NULL) ? object->Size() : size_func_(object); | 2299 int size = object->Size(); |
2307 | 2300 |
2308 current_ += size; | 2301 current_ += size; |
2309 return object; | 2302 return object; |
2310 } | 2303 } |
2311 | 2304 |
2312 // Implementation of the ObjectIterator functions. | 2305 // Implementation of the ObjectIterator functions. |
2313 virtual HeapObject* next_object() { return Next(); } | 2306 virtual HeapObject* next_object() { return Next(); } |
2314 | 2307 |
2315 private: | 2308 private: |
2316 void Initialize(Address start, Address end, HeapObjectCallback size_func); | 2309 void Initialize(Address start, Address end); |
2317 | 2310 |
2318 // The current iteration point. | 2311 // The current iteration point. |
2319 Address current_; | 2312 Address current_; |
2320 // The end of iteration. | 2313 // The end of iteration. |
2321 Address limit_; | 2314 Address limit_; |
2322 // The callback function. | |
2323 HeapObjectCallback size_func_; | |
2324 }; | 2315 }; |
2325 | 2316 |
2326 | 2317 |
2327 // ----------------------------------------------------------------------------- | 2318 // ----------------------------------------------------------------------------- |
2328 // A PageIterator iterates the pages in a semi-space. | 2319 // A PageIterator iterates the pages in a semi-space. |
2329 class NewSpacePageIterator BASE_EMBEDDED { | 2320 class NewSpacePageIterator BASE_EMBEDDED { |
2330 public: | 2321 public: |
2331 // Make an iterator that runs over all pages in to-space. | 2322 // Make an iterator that runs over all pages in to-space. |
2332 explicit inline NewSpacePageIterator(NewSpace* space); | 2323 explicit inline NewSpacePageIterator(NewSpace* space); |
2333 | 2324 |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2811 // Map MemoryChunk::kAlignment-aligned chunks to large pages covering them | 2802 // Map MemoryChunk::kAlignment-aligned chunks to large pages covering them |
2812 HashMap chunk_map_; | 2803 HashMap chunk_map_; |
2813 | 2804 |
2814 friend class LargeObjectIterator; | 2805 friend class LargeObjectIterator; |
2815 }; | 2806 }; |
2816 | 2807 |
2817 | 2808 |
2818 class LargeObjectIterator : public ObjectIterator { | 2809 class LargeObjectIterator : public ObjectIterator { |
2819 public: | 2810 public: |
2820 explicit LargeObjectIterator(LargeObjectSpace* space); | 2811 explicit LargeObjectIterator(LargeObjectSpace* space); |
2821 LargeObjectIterator(LargeObjectSpace* space, HeapObjectCallback size_func); | |
2822 | 2812 |
2823 HeapObject* Next(); | 2813 HeapObject* Next(); |
2824 | 2814 |
2825 // implementation of ObjectIterator. | 2815 // implementation of ObjectIterator. |
2826 virtual HeapObject* next_object() { return Next(); } | 2816 virtual HeapObject* next_object() { return Next(); } |
2827 | 2817 |
2828 private: | 2818 private: |
2829 LargePage* current_; | 2819 LargePage* current_; |
2830 HeapObjectCallback size_func_; | |
2831 }; | 2820 }; |
2832 | 2821 |
2833 | 2822 |
2834 // Iterates over the chunks (pages and large object pages) that can contain | 2823 // Iterates over the chunks (pages and large object pages) that can contain |
2835 // pointers to new space. | 2824 // pointers to new space. |
2836 class PointerChunkIterator BASE_EMBEDDED { | 2825 class PointerChunkIterator BASE_EMBEDDED { |
2837 public: | 2826 public: |
2838 inline explicit PointerChunkIterator(Heap* heap); | 2827 inline explicit PointerChunkIterator(Heap* heap); |
2839 | 2828 |
2840 // Return NULL when the iterator is done. | 2829 // Return NULL when the iterator is done. |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2898 count = 0; | 2887 count = 0; |
2899 } | 2888 } |
2900 // Must be small, since an iteration is used for lookup. | 2889 // Must be small, since an iteration is used for lookup. |
2901 static const int kMaxComments = 64; | 2890 static const int kMaxComments = 64; |
2902 }; | 2891 }; |
2903 #endif | 2892 #endif |
2904 } | 2893 } |
2905 } // namespace v8::internal | 2894 } // namespace v8::internal |
2906 | 2895 |
2907 #endif // V8_HEAP_SPACES_H_ | 2896 #endif // V8_HEAP_SPACES_H_ |
OLD | NEW |