OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_HEAP_H_ | 5 #ifndef V8_HEAP_HEAP_H_ |
6 #define V8_HEAP_HEAP_H_ | 6 #define V8_HEAP_HEAP_H_ |
7 | 7 |
8 #include <cmath> | 8 #include <cmath> |
9 #include <map> | 9 #include <map> |
10 | 10 |
11 // Clients of this interface shouldn't depend on lots of heap internals. | 11 // Clients of this interface shouldn't depend on lots of heap internals. |
12 // Do not include anything from src/heap here! | 12 // Do not include anything from src/heap here! |
13 #include "include/v8.h" | 13 #include "include/v8.h" |
14 #include "src/allocation.h" | 14 #include "src/allocation.h" |
15 #include "src/assert-scope.h" | 15 #include "src/assert-scope.h" |
16 #include "src/base/atomic-utils.h" | 16 #include "src/base/atomic-utils.h" |
17 #include "src/debug/debug-interface.h" | 17 #include "src/debug/debug-interface.h" |
18 #include "src/globals.h" | 18 #include "src/globals.h" |
19 #include "src/heap-symbols.h" | 19 #include "src/heap-symbols.h" |
20 #include "src/list.h" | 20 #include "src/list.h" |
21 #include "src/objects.h" | 21 #include "src/objects.h" |
22 #include "src/objects/hash-table.h" | 22 #include "src/objects/hash-table.h" |
23 #include "src/objects/string-table.h" | 23 #include "src/objects/string-table.h" |
| 24 #include "src/visitors.h" |
24 | 25 |
25 namespace v8 { | 26 namespace v8 { |
26 namespace internal { | 27 namespace internal { |
27 | 28 |
28 using v8::MemoryPressureLevel; | 29 using v8::MemoryPressureLevel; |
29 | 30 |
30 // Defines all the roots in Heap. | 31 // Defines all the roots in Heap. |
31 #define STRONG_ROOT_LIST(V) \ | 32 #define STRONG_ROOT_LIST(V) \ |
32 /* Cluster the most popular ones in a few cache lines here at the top. */ \ | 33 /* Cluster the most popular ones in a few cache lines here at the top. */ \ |
33 /* The first 32 entries are most often used in the startup snapshot and */ \ | 34 /* The first 32 entries are most often used in the startup snapshot and */ \ |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 class HistogramTimer; | 351 class HistogramTimer; |
351 class Isolate; | 352 class Isolate; |
352 class LocalEmbedderHeapTracer; | 353 class LocalEmbedderHeapTracer; |
353 class MemoryAllocator; | 354 class MemoryAllocator; |
354 class MemoryReducer; | 355 class MemoryReducer; |
355 class MinorMarkCompactCollector; | 356 class MinorMarkCompactCollector; |
356 class ObjectIterator; | 357 class ObjectIterator; |
357 class ObjectStats; | 358 class ObjectStats; |
358 class Page; | 359 class Page; |
359 class PagedSpace; | 360 class PagedSpace; |
| 361 class RootVisitor; |
360 class Scavenger; | 362 class Scavenger; |
361 class ScavengeJob; | 363 class ScavengeJob; |
362 class Space; | 364 class Space; |
363 class StoreBuffer; | 365 class StoreBuffer; |
364 class TracePossibleWrapperReporter; | 366 class TracePossibleWrapperReporter; |
365 class WeakObjectRetainer; | 367 class WeakObjectRetainer; |
366 | 368 |
367 typedef void (*ObjectSlotCallback)(HeapObject** from, HeapObject* to); | 369 typedef void (*ObjectSlotCallback)(HeapObject** from, HeapObject* to); |
368 | 370 |
369 enum ArrayStorageAllocationMode { | 371 enum ArrayStorageAllocationMode { |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 | 810 |
809 // Used in CreateAllocationSiteStub and the (de)serializer. | 811 // Used in CreateAllocationSiteStub and the (de)serializer. |
810 Object** allocation_sites_list_address() { return &allocation_sites_list_; } | 812 Object** allocation_sites_list_address() { return &allocation_sites_list_; } |
811 | 813 |
812 void set_encountered_weak_collections(Object* weak_collection) { | 814 void set_encountered_weak_collections(Object* weak_collection) { |
813 encountered_weak_collections_ = weak_collection; | 815 encountered_weak_collections_ = weak_collection; |
814 } | 816 } |
815 Object* encountered_weak_collections() const { | 817 Object* encountered_weak_collections() const { |
816 return encountered_weak_collections_; | 818 return encountered_weak_collections_; |
817 } | 819 } |
818 void VisitEncounteredWeakCollections(ObjectVisitor* visitor) { | 820 void IterateEncounteredWeakCollections(RootVisitor* visitor); |
819 visitor->VisitPointer(&encountered_weak_collections_); | |
820 } | |
821 | 821 |
822 void set_encountered_weak_cells(Object* weak_cell) { | 822 void set_encountered_weak_cells(Object* weak_cell) { |
823 encountered_weak_cells_ = weak_cell; | 823 encountered_weak_cells_ = weak_cell; |
824 } | 824 } |
825 Object* encountered_weak_cells() const { return encountered_weak_cells_; } | 825 Object* encountered_weak_cells() const { return encountered_weak_cells_; } |
826 | 826 |
827 void set_encountered_transition_arrays(Object* transition_array) { | 827 void set_encountered_transition_arrays(Object* transition_array) { |
828 encountered_transition_arrays_ = transition_array; | 828 encountered_transition_arrays_ = transition_array; |
829 } | 829 } |
830 Object* encountered_transition_arrays() const { | 830 Object* encountered_transition_arrays() const { |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 void ReportExternalMemoryPressure(); | 1198 void ReportExternalMemoryPressure(); |
1199 | 1199 |
1200 // Invoked when GC was requested via the stack guard. | 1200 // Invoked when GC was requested via the stack guard. |
1201 void HandleGCRequest(); | 1201 void HandleGCRequest(); |
1202 | 1202 |
1203 // =========================================================================== | 1203 // =========================================================================== |
1204 // Iterators. ================================================================ | 1204 // Iterators. ================================================================ |
1205 // =========================================================================== | 1205 // =========================================================================== |
1206 | 1206 |
1207 // Iterates over all roots in the heap. | 1207 // Iterates over all roots in the heap. |
1208 void IterateRoots(ObjectVisitor* v, VisitMode mode); | 1208 void IterateRoots(RootVisitor* v, VisitMode mode); |
1209 // Iterates over all strong roots in the heap. | 1209 // Iterates over all strong roots in the heap. |
1210 void IterateStrongRoots(ObjectVisitor* v, VisitMode mode); | 1210 void IterateStrongRoots(RootVisitor* v, VisitMode mode); |
1211 // Iterates over entries in the smi roots list. Only interesting to the | 1211 // Iterates over entries in the smi roots list. Only interesting to the |
1212 // serializer/deserializer, since GC does not care about smis. | 1212 // serializer/deserializer, since GC does not care about smis. |
1213 void IterateSmiRoots(ObjectVisitor* v); | 1213 void IterateSmiRoots(RootVisitor* v); |
1214 // Iterates over all the other roots in the heap. | 1214 // Iterates over all the other roots in the heap. |
1215 void IterateWeakRoots(ObjectVisitor* v, VisitMode mode); | 1215 void IterateWeakRoots(RootVisitor* v, VisitMode mode); |
1216 | 1216 |
1217 // Iterate pointers of promoted objects. | 1217 // Iterate pointers of promoted objects. |
1218 void IterateAndScavengePromotedObject(HeapObject* target, int size, | 1218 void IterateAndScavengePromotedObject(HeapObject* target, int size, |
1219 bool was_marked_black); | 1219 bool was_marked_black); |
1220 | 1220 |
1221 // =========================================================================== | 1221 // =========================================================================== |
1222 // Store buffer API. ========================================================= | 1222 // Store buffer API. ========================================================= |
1223 // =========================================================================== | 1223 // =========================================================================== |
1224 | 1224 |
1225 // Write barrier support for object[offset] = o; | 1225 // Write barrier support for object[offset] = o; |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1562 class PretenuringScope; | 1562 class PretenuringScope; |
1563 | 1563 |
1564 // External strings table is a place where all external strings are | 1564 // External strings table is a place where all external strings are |
1565 // registered. We need to keep track of such strings to properly | 1565 // registered. We need to keep track of such strings to properly |
1566 // finalize them. | 1566 // finalize them. |
1567 class ExternalStringTable { | 1567 class ExternalStringTable { |
1568 public: | 1568 public: |
1569 // Registers an external string. | 1569 // Registers an external string. |
1570 inline void AddString(String* string); | 1570 inline void AddString(String* string); |
1571 | 1571 |
1572 inline void IterateAll(ObjectVisitor* v); | 1572 inline void IterateAll(RootVisitor* v); |
1573 inline void IterateNewSpaceStrings(ObjectVisitor* v); | 1573 inline void IterateNewSpaceStrings(RootVisitor* v); |
1574 inline void PromoteAllNewSpaceStrings(); | 1574 inline void PromoteAllNewSpaceStrings(); |
1575 | 1575 |
1576 // Restores internal invariant and gets rid of collected strings. Must be | 1576 // Restores internal invariant and gets rid of collected strings. Must be |
1577 // called after each Iterate*() that modified the strings. | 1577 // called after each Iterate*() that modified the strings. |
1578 void CleanUpAll(); | 1578 void CleanUpAll(); |
1579 void CleanUpNewSpaceStrings(); | 1579 void CleanUpNewSpaceStrings(); |
1580 | 1580 |
1581 // Destroys all allocated memory. | 1581 // Destroys all allocated memory. |
1582 void TearDown(); | 1582 void TearDown(); |
1583 | 1583 |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1846 void MinorMarkCompact(); | 1846 void MinorMarkCompact(); |
1847 | 1847 |
1848 // Code to be run before and after mark-compact. | 1848 // Code to be run before and after mark-compact. |
1849 void MarkCompactPrologue(); | 1849 void MarkCompactPrologue(); |
1850 void MarkCompactEpilogue(); | 1850 void MarkCompactEpilogue(); |
1851 | 1851 |
1852 // Performs a minor collection in new generation. | 1852 // Performs a minor collection in new generation. |
1853 void Scavenge(); | 1853 void Scavenge(); |
1854 void EvacuateYoungGeneration(); | 1854 void EvacuateYoungGeneration(); |
1855 | 1855 |
1856 Address DoScavenge(ObjectVisitor* scavenge_visitor, Address new_space_front); | 1856 Address DoScavenge(Address new_space_front); |
1857 | 1857 |
1858 void UpdateNewSpaceReferencesInExternalStringTable( | 1858 void UpdateNewSpaceReferencesInExternalStringTable( |
1859 ExternalStringTableUpdaterCallback updater_func); | 1859 ExternalStringTableUpdaterCallback updater_func); |
1860 | 1860 |
1861 void UpdateReferencesInExternalStringTable( | 1861 void UpdateReferencesInExternalStringTable( |
1862 ExternalStringTableUpdaterCallback updater_func); | 1862 ExternalStringTableUpdaterCallback updater_func); |
1863 | 1863 |
1864 void ProcessAllWeakReferences(WeakObjectRetainer* retainer); | 1864 void ProcessAllWeakReferences(WeakObjectRetainer* retainer); |
1865 void ProcessYoungWeakReferences(WeakObjectRetainer* retainer); | 1865 void ProcessYoungWeakReferences(WeakObjectRetainer* retainer); |
1866 void ProcessNativeContexts(WeakObjectRetainer* retainer); | 1866 void ProcessNativeContexts(WeakObjectRetainer* retainer); |
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2480 private: | 2480 private: |
2481 Heap* heap_; | 2481 Heap* heap_; |
2482 }; | 2482 }; |
2483 | 2483 |
2484 | 2484 |
2485 // Visitor class to verify interior pointers in spaces that do not contain | 2485 // Visitor class to verify interior pointers in spaces that do not contain |
2486 // or care about intergenerational references. All heap object pointers have to | 2486 // or care about intergenerational references. All heap object pointers have to |
2487 // point into the heap to a location that has a map pointer at its first word. | 2487 // point into the heap to a location that has a map pointer at its first word. |
2488 // Caveat: Heap::Contains is an approximation because it can return true for | 2488 // Caveat: Heap::Contains is an approximation because it can return true for |
2489 // objects in a heap space but above the allocation pointer. | 2489 // objects in a heap space but above the allocation pointer. |
2490 class VerifyPointersVisitor : public ObjectVisitor { | 2490 class VerifyPointersVisitor : public ObjectVisitor, public RootVisitor { |
2491 public: | 2491 public: |
2492 inline void VisitPointers(Object** start, Object** end) override; | 2492 inline void VisitPointers(Object** start, Object** end) override; |
| 2493 inline void VisitRootPointers(Root root, Object** start, |
| 2494 Object** end) override; |
| 2495 |
| 2496 private: |
| 2497 inline void VerifyPointers(Object** start, Object** end); |
2493 }; | 2498 }; |
2494 | 2499 |
2495 | 2500 |
2496 // Verify that all objects are Smis. | 2501 // Verify that all objects are Smis. |
2497 class VerifySmisVisitor : public ObjectVisitor { | 2502 class VerifySmisVisitor : public RootVisitor { |
2498 public: | 2503 public: |
2499 inline void VisitPointers(Object** start, Object** end) override; | 2504 inline void VisitRootPointers(Root root, Object** start, |
| 2505 Object** end) override; |
2500 }; | 2506 }; |
2501 | 2507 |
2502 | 2508 |
2503 // Space iterator for iterating over all spaces of the heap. Returns each space | 2509 // Space iterator for iterating over all spaces of the heap. Returns each space |
2504 // in turn, and null when it is done. | 2510 // in turn, and null when it is done. |
2505 class AllSpaces BASE_EMBEDDED { | 2511 class AllSpaces BASE_EMBEDDED { |
2506 public: | 2512 public: |
2507 explicit AllSpaces(Heap* heap) : heap_(heap), counter_(FIRST_SPACE) {} | 2513 explicit AllSpaces(Heap* heap) : heap_(heap), counter_(FIRST_SPACE) {} |
2508 Space* next(); | 2514 Space* next(); |
2509 | 2515 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2654 friend class PagedSpace; | 2660 friend class PagedSpace; |
2655 DISALLOW_COPY_AND_ASSIGN(AllocationObserver); | 2661 DISALLOW_COPY_AND_ASSIGN(AllocationObserver); |
2656 }; | 2662 }; |
2657 | 2663 |
2658 V8_EXPORT_PRIVATE const char* AllocationSpaceName(AllocationSpace space); | 2664 V8_EXPORT_PRIVATE const char* AllocationSpaceName(AllocationSpace space); |
2659 | 2665 |
2660 } // namespace internal | 2666 } // namespace internal |
2661 } // namespace v8 | 2667 } // namespace v8 |
2662 | 2668 |
2663 #endif // V8_HEAP_HEAP_H_ | 2669 #endif // V8_HEAP_HEAP_H_ |
OLD | NEW |