• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 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_HEAP_WRITE_BARRIER_H_
6 #define V8_HEAP_HEAP_WRITE_BARRIER_H_
7 
8 #include "include/v8-internal.h"
9 #include "src/base/optional.h"
10 #include "src/common/globals.h"
11 
12 namespace v8 {
13 namespace internal {
14 
15 class ArrayBufferExtension;
16 class Code;
17 class DescriptorArray;
18 class EphemeronHashTable;
19 class FixedArray;
20 class Heap;
21 class JSArrayBuffer;
22 class Map;
23 class MarkCompactCollector;
24 class MarkingBarrier;
25 class RelocInfo;
26 
27 // Note: In general it is preferred to use the macros defined in
28 // object-macros.h.
29 
30 // Combined write barriers.
31 void WriteBarrierForCode(Code host, RelocInfo* rinfo, Object value);
32 void WriteBarrierForCode(Code host, RelocInfo* rinfo, HeapObject value);
33 void WriteBarrierForCode(Code host);
34 
35 // Generational write barrier.
36 void GenerationalBarrier(HeapObject object, ObjectSlot slot, Object value);
37 void GenerationalBarrier(HeapObject object, ObjectSlot slot, HeapObject value);
38 void GenerationalBarrier(HeapObject object, MaybeObjectSlot slot,
39                          MaybeObject value);
40 void GenerationalEphemeronKeyBarrier(EphemeronHashTable table, ObjectSlot slot,
41                                      Object value);
42 void GenerationalBarrierForCode(Code host, RelocInfo* rinfo, HeapObject object);
43 
44 inline bool IsReadOnlyHeapObject(HeapObject object);
45 
46 class V8_EXPORT_PRIVATE WriteBarrier {
47  public:
48   static inline void Marking(HeapObject host, ObjectSlot, Object value);
49   static inline void Marking(HeapObject host, HeapObjectSlot, HeapObject value);
50   static inline void Marking(HeapObject host, MaybeObjectSlot,
51                              MaybeObject value);
52   static inline void Marking(Code host, RelocInfo*, HeapObject value);
53   static inline void Marking(JSArrayBuffer host, ArrayBufferExtension*);
54   static inline void Marking(DescriptorArray, int number_of_own_descriptors);
55   // It is invoked from generated code and has to take raw addresses.
56   static int MarkingFromCode(Address raw_host, Address raw_slot);
57 
58   static void SetForThread(MarkingBarrier*);
59   static void ClearForThread(MarkingBarrier*);
60 
61  private:
62   static void MarkingSlow(Heap* heap, HeapObject host, HeapObjectSlot,
63                           HeapObject value);
64   static void MarkingSlow(Heap* heap, Code host, RelocInfo*, HeapObject value);
65   static void MarkingSlow(Heap* heap, JSArrayBuffer host,
66                           ArrayBufferExtension*);
67   static void MarkingSlow(Heap* heap, DescriptorArray,
68                           int number_of_own_descriptors);
69   static inline base::Optional<Heap*> GetHeapIfMarking(HeapObject object);
70 };
71 
72 }  // namespace internal
73 }  // namespace v8
74 
75 #endif  // V8_HEAP_HEAP_WRITE_BARRIER_H_
76