Home | History | Annotate | Download | only in heap
      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:
     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();
     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:
     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