• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_HEAP_SCAVENGER_H_
6 #define V8_HEAP_SCAVENGER_H_
7 
8 #include "src/heap/objects-visiting.h"
9 
10 namespace v8 {
11 namespace internal {
12 
13 typedef void (*ScavengingCallback)(Map* map, HeapObject** slot,
14                                    HeapObject* object);
15 
16 class Scavenger {
17  public:
Scavenger(Heap * heap)18   explicit Scavenger(Heap* heap) : heap_(heap) {}
19 
20   // Initializes static visitor dispatch tables.
21   static void Initialize();
22 
23   // Callback function passed to Heap::Iterate etc.  Copies an object if
24   // necessary, the object might be promoted to an old space.  The caller must
25   // ensure the precondition that the object is (a) a heap object and (b) in
26   // the heap's from space.
27   static inline void ScavengeObject(HeapObject** p, HeapObject* object);
28 
29   // Slow part of {ScavengeObject} above.
30   static void ScavengeObjectSlow(HeapObject** p, HeapObject* object);
31 
32   // Chooses an appropriate static visitor table depending on the current state
33   // of the heap (i.e. incremental marking, logging and profiling).
34   void SelectScavengingVisitorsTable();
35 
36   Isolate* isolate();
heap()37   Heap* heap() { return heap_; }
38 
39  private:
40   Heap* heap_;
41   VisitorDispatchTable<ScavengingCallback> scavenging_visitors_table_;
42 };
43 
44 
45 // Helper class for turning the scavenger into an object visitor that is also
46 // filtering out non-HeapObjects and objects which do not reside in new space.
47 class ScavengeVisitor : public ObjectVisitor {
48  public:
ScavengeVisitor(Heap * heap)49   explicit ScavengeVisitor(Heap* heap) : heap_(heap) {}
50 
51   void VisitPointer(Object** p) override;
52   void VisitPointers(Object** start, Object** end) override;
53 
54  private:
55   inline void ScavengePointer(Object** p);
56 
57   Heap* heap_;
58 };
59 
60 
61 // Helper class for turning the scavenger into an object visitor that is also
62 // filtering out non-HeapObjects and objects which do not reside in new space.
63 class StaticScavengeVisitor
64     : public StaticNewSpaceVisitor<StaticScavengeVisitor> {
65  public:
66   static inline void VisitPointer(Heap* heap, HeapObject* object, Object** p);
67 };
68 
69 }  // namespace internal
70 }  // namespace v8
71 
72 #endif  // V8_HEAP_SCAVENGER_H_
73