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