| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 // used as a marking stack and its page headers are destroyed. | 590 // used as a marking stack and its page headers are destroyed. |
| 591 static Page* InitializePagesInChunk(int chunk_id, int pages_in_chunk, | 591 static Page* InitializePagesInChunk(int chunk_id, int pages_in_chunk, |
| 592 PagedSpace* owner); | 592 PagedSpace* owner); |
| 593 }; | 593 }; |
| 594 | 594 |
| 595 | 595 |
| 596 // ----------------------------------------------------------------------------- | 596 // ----------------------------------------------------------------------------- |
| 597 // Interface for heap object iterator to be implemented by all object space | 597 // Interface for heap object iterator to be implemented by all object space |
| 598 // object iterators. | 598 // object iterators. |
| 599 // | 599 // |
| 600 // NOTE: The space specific object iterators also implements the own has_next() | 600 // NOTE: The space specific object iterators also implements the own next() |
| 601 // and next() methods which are used to avoid using virtual functions | 601 // method which is used to avoid using virtual functions |
| 602 // iterating a specific space. | 602 // iterating a specific space. |
| 603 | 603 |
| 604 class ObjectIterator : public Malloced { | 604 class ObjectIterator : public Malloced { |
| 605 public: | 605 public: |
| 606 virtual ~ObjectIterator() { } | 606 virtual ~ObjectIterator() { } |
| 607 | 607 |
| 608 virtual bool has_next_object() = 0; | |
| 609 virtual HeapObject* next_object() = 0; | 608 virtual HeapObject* next_object() = 0; |
| 610 }; | 609 }; |
| 611 | 610 |
| 612 | 611 |
| 613 // ----------------------------------------------------------------------------- | 612 // ----------------------------------------------------------------------------- |
| 614 // Heap object iterator in new/old/map spaces. | 613 // Heap object iterator in new/old/map spaces. |
| 615 // | 614 // |
| 616 // A HeapObjectIterator iterates objects from a given address to the | 615 // A HeapObjectIterator iterates objects from a given address to the |
| 617 // top of a space. The given address must be below the current | 616 // top of a space. The given address must be below the current |
| 618 // allocation pointer (space top). There are some caveats. | 617 // allocation pointer (space top). There are some caveats. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 638 // address is not given, the iterator starts from the space bottom. | 637 // address is not given, the iterator starts from the space bottom. |
| 639 // If the size function is not given, the iterator calls the default | 638 // If the size function is not given, the iterator calls the default |
| 640 // Object::Size(). | 639 // Object::Size(). |
| 641 explicit HeapObjectIterator(PagedSpace* space); | 640 explicit HeapObjectIterator(PagedSpace* space); |
| 642 HeapObjectIterator(PagedSpace* space, HeapObjectCallback size_func); | 641 HeapObjectIterator(PagedSpace* space, HeapObjectCallback size_func); |
| 643 HeapObjectIterator(PagedSpace* space, Address start); | 642 HeapObjectIterator(PagedSpace* space, Address start); |
| 644 HeapObjectIterator(PagedSpace* space, | 643 HeapObjectIterator(PagedSpace* space, |
| 645 Address start, | 644 Address start, |
| 646 HeapObjectCallback size_func); | 645 HeapObjectCallback size_func); |
| 647 | 646 |
| 648 inline bool has_next(); | 647 inline HeapObject* next() { |
| 649 inline HeapObject* next(); | 648 return (cur_addr_ < cur_limit_) ? FromCurrentPage() : FromNextPage(); |
| 649 } |
| 650 | 650 |
| 651 // implementation of ObjectIterator. | 651 // implementation of ObjectIterator. |
| 652 virtual bool has_next_object() { return has_next(); } | |
| 653 virtual HeapObject* next_object() { return next(); } | 652 virtual HeapObject* next_object() { return next(); } |
| 654 | 653 |
| 655 private: | 654 private: |
| 656 Address cur_addr_; // current iteration point | 655 Address cur_addr_; // current iteration point |
| 657 Address end_addr_; // end iteration point | 656 Address end_addr_; // end iteration point |
| 658 Address cur_limit_; // current page limit | 657 Address cur_limit_; // current page limit |
| 659 HeapObjectCallback size_func_; // size function | 658 HeapObjectCallback size_func_; // size function |
| 660 Page* end_page_; // caches the page of the end address | 659 Page* end_page_; // caches the page of the end address |
| 661 | 660 |
| 662 // Slow path of has_next, checks whether there are more objects in | 661 HeapObject* FromCurrentPage() { |
| 663 // the next page. | 662 ASSERT(cur_addr_ < cur_limit_); |
| 664 bool HasNextInNextPage(); | 663 |
| 664 HeapObject* obj = HeapObject::FromAddress(cur_addr_); |
| 665 int obj_size = (size_func_ == NULL) ? obj->Size() : size_func_(obj); |
| 666 ASSERT_OBJECT_SIZE(obj_size); |
| 667 |
| 668 cur_addr_ += obj_size; |
| 669 ASSERT(cur_addr_ <= cur_limit_); |
| 670 |
| 671 return obj; |
| 672 } |
| 673 |
| 674 // Slow path of next, goes into the next page. |
| 675 HeapObject* FromNextPage(); |
| 665 | 676 |
| 666 // Initializes fields. | 677 // Initializes fields. |
| 667 void Initialize(Address start, Address end, HeapObjectCallback size_func); | 678 void Initialize(Address start, Address end, HeapObjectCallback size_func); |
| 668 | 679 |
| 669 #ifdef DEBUG | 680 #ifdef DEBUG |
| 670 // Verifies whether fields have valid values. | 681 // Verifies whether fields have valid values. |
| 671 void Verify(); | 682 void Verify(); |
| 672 #endif | 683 #endif |
| 673 }; | 684 }; |
| 674 | 685 |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1199 // iterator is created are not iterated. | 1210 // iterator is created are not iterated. |
| 1200 class SemiSpaceIterator : public ObjectIterator { | 1211 class SemiSpaceIterator : public ObjectIterator { |
| 1201 public: | 1212 public: |
| 1202 // Create an iterator over the objects in the given space. If no start | 1213 // Create an iterator over the objects in the given space. If no start |
| 1203 // address is given, the iterator starts from the bottom of the space. If | 1214 // address is given, the iterator starts from the bottom of the space. If |
| 1204 // no size function is given, the iterator calls Object::Size(). | 1215 // no size function is given, the iterator calls Object::Size(). |
| 1205 explicit SemiSpaceIterator(NewSpace* space); | 1216 explicit SemiSpaceIterator(NewSpace* space); |
| 1206 SemiSpaceIterator(NewSpace* space, HeapObjectCallback size_func); | 1217 SemiSpaceIterator(NewSpace* space, HeapObjectCallback size_func); |
| 1207 SemiSpaceIterator(NewSpace* space, Address start); | 1218 SemiSpaceIterator(NewSpace* space, Address start); |
| 1208 | 1219 |
| 1209 bool has_next() {return current_ < limit_; } | |
| 1210 | |
| 1211 HeapObject* next() { | 1220 HeapObject* next() { |
| 1212 ASSERT(has_next()); | 1221 if (current_ == limit_) return NULL; |
| 1213 | 1222 |
| 1214 HeapObject* object = HeapObject::FromAddress(current_); | 1223 HeapObject* object = HeapObject::FromAddress(current_); |
| 1215 int size = (size_func_ == NULL) ? object->Size() : size_func_(object); | 1224 int size = (size_func_ == NULL) ? object->Size() : size_func_(object); |
| 1216 | 1225 |
| 1217 current_ += size; | 1226 current_ += size; |
| 1218 return object; | 1227 return object; |
| 1219 } | 1228 } |
| 1220 | 1229 |
| 1221 // Implementation of the ObjectIterator functions. | 1230 // Implementation of the ObjectIterator functions. |
| 1222 virtual bool has_next_object() { return has_next(); } | |
| 1223 virtual HeapObject* next_object() { return next(); } | 1231 virtual HeapObject* next_object() { return next(); } |
| 1224 | 1232 |
| 1225 private: | 1233 private: |
| 1226 void Initialize(NewSpace* space, Address start, Address end, | 1234 void Initialize(NewSpace* space, Address start, Address end, |
| 1227 HeapObjectCallback size_func); | 1235 HeapObjectCallback size_func); |
| 1228 | 1236 |
| 1229 // The semispace. | 1237 // The semispace. |
| 1230 SemiSpace* space_; | 1238 SemiSpace* space_; |
| 1231 // The current iteration point. | 1239 // The current iteration point. |
| 1232 Address current_; | 1240 Address current_; |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1793 bool NeedsCompaction(int live_maps) { | 1801 bool NeedsCompaction(int live_maps) { |
| 1794 return !MapPointersEncodable() && live_maps <= CompactionThreshold(); | 1802 return !MapPointersEncodable() && live_maps <= CompactionThreshold(); |
| 1795 } | 1803 } |
| 1796 | 1804 |
| 1797 Address TopAfterCompaction(int live_maps) { | 1805 Address TopAfterCompaction(int live_maps) { |
| 1798 ASSERT(NeedsCompaction(live_maps)); | 1806 ASSERT(NeedsCompaction(live_maps)); |
| 1799 | 1807 |
| 1800 int pages_left = live_maps / kMapsPerPage; | 1808 int pages_left = live_maps / kMapsPerPage; |
| 1801 PageIterator it(this, PageIterator::ALL_PAGES); | 1809 PageIterator it(this, PageIterator::ALL_PAGES); |
| 1802 while (pages_left-- > 0) { | 1810 while (pages_left-- > 0) { |
| 1803 it.has_next(); // Must be called for side-effects, see bug 586. | |
| 1804 ASSERT(it.has_next()); | 1811 ASSERT(it.has_next()); |
| 1805 it.next()->ClearRSet(); | 1812 it.next()->ClearRSet(); |
| 1806 } | 1813 } |
| 1807 it.has_next(); // Must be called for side-effects, see bug 586. | |
| 1808 ASSERT(it.has_next()); | 1814 ASSERT(it.has_next()); |
| 1809 Page* top_page = it.next(); | 1815 Page* top_page = it.next(); |
| 1810 top_page->ClearRSet(); | 1816 top_page->ClearRSet(); |
| 1811 ASSERT(top_page->is_valid()); | 1817 ASSERT(top_page->is_valid()); |
| 1812 | 1818 |
| 1813 int offset = live_maps % kMapsPerPage * Map::kSize; | 1819 int offset = live_maps % kMapsPerPage * Map::kSize; |
| 1814 Address top = top_page->ObjectAreaStart() + offset; | 1820 Address top = top_page->ObjectAreaStart() + offset; |
| 1815 ASSERT(top < top_page->ObjectAreaEnd()); | 1821 ASSERT(top < top_page->ObjectAreaEnd()); |
| 1816 ASSERT(Contains(top)); | 1822 ASSERT(Contains(top)); |
| 1817 | 1823 |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2047 public: | 2053 public: |
| 2048 TRACK_MEMORY("LargeObjectSpace") | 2054 TRACK_MEMORY("LargeObjectSpace") |
| 2049 }; | 2055 }; |
| 2050 | 2056 |
| 2051 | 2057 |
| 2052 class LargeObjectIterator: public ObjectIterator { | 2058 class LargeObjectIterator: public ObjectIterator { |
| 2053 public: | 2059 public: |
| 2054 explicit LargeObjectIterator(LargeObjectSpace* space); | 2060 explicit LargeObjectIterator(LargeObjectSpace* space); |
| 2055 LargeObjectIterator(LargeObjectSpace* space, HeapObjectCallback size_func); | 2061 LargeObjectIterator(LargeObjectSpace* space, HeapObjectCallback size_func); |
| 2056 | 2062 |
| 2057 bool has_next() { return current_ != NULL; } | |
| 2058 HeapObject* next(); | 2063 HeapObject* next(); |
| 2059 | 2064 |
| 2060 // implementation of ObjectIterator. | 2065 // implementation of ObjectIterator. |
| 2061 virtual bool has_next_object() { return has_next(); } | |
| 2062 virtual HeapObject* next_object() { return next(); } | 2066 virtual HeapObject* next_object() { return next(); } |
| 2063 | 2067 |
| 2064 private: | 2068 private: |
| 2065 LargeObjectChunk* current_; | 2069 LargeObjectChunk* current_; |
| 2066 HeapObjectCallback size_func_; | 2070 HeapObjectCallback size_func_; |
| 2067 }; | 2071 }; |
| 2068 | 2072 |
| 2069 | 2073 |
| 2070 } } // namespace v8::internal | 2074 } } // namespace v8::internal |
| 2071 | 2075 |
| 2072 #endif // V8_SPACES_H_ | 2076 #endif // V8_SPACES_H_ |
| OLD | NEW |