1 // Copyright 2021 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_CPPGC_JS_CPP_MARKING_STATE_H_ 6 #define V8_HEAP_CPPGC_JS_CPP_MARKING_STATE_H_ 7 8 #include <memory> 9 10 #include "src/heap/cppgc-js/cpp-heap.h" 11 #include "src/heap/cppgc/marking-state.h" 12 #include "src/heap/cppgc/marking-worklists.h" 13 #include "src/objects/embedder-data-slot.h" 14 15 namespace v8 { 16 namespace internal { 17 18 class JSObject; 19 class EmbedderDataSlot; 20 21 class CppMarkingState { 22 public: 23 using EmbedderDataSnapshot = 24 std::pair<EmbedderDataSlot::EmbedderDataSlotSnapshot, 25 EmbedderDataSlot::EmbedderDataSlotSnapshot>; 26 CppMarkingState(Isolate * isolate,const WrapperDescriptor & wrapper_descriptor,cppgc::internal::MarkingStateBase & main_thread_marking_state)27 CppMarkingState(Isolate* isolate, const WrapperDescriptor& wrapper_descriptor, 28 cppgc::internal::MarkingStateBase& main_thread_marking_state) 29 : isolate_(isolate), 30 wrapper_descriptor_(wrapper_descriptor), 31 owned_marking_state_(nullptr), 32 marking_state_(main_thread_marking_state) {} 33 CppMarkingState(Isolate * isolate,const WrapperDescriptor & wrapper_descriptor,std::unique_ptr<cppgc::internal::MarkingStateBase> concurrent_marking_state)34 CppMarkingState(Isolate* isolate, const WrapperDescriptor& wrapper_descriptor, 35 std::unique_ptr<cppgc::internal::MarkingStateBase> 36 concurrent_marking_state) 37 : isolate_(isolate), 38 wrapper_descriptor_(wrapper_descriptor), 39 owned_marking_state_(std::move(concurrent_marking_state)), 40 marking_state_(*owned_marking_state_) {} 41 CppMarkingState(const CppMarkingState&) = delete; 42 CppMarkingState& operator=(const CppMarkingState&) = delete; 43 Publish()44 void Publish() { marking_state_.Publish(); } 45 46 inline bool ExtractEmbedderDataSnapshot(Map, JSObject, EmbedderDataSnapshot&); 47 48 inline void MarkAndPush(const EmbedderDataSnapshot&); 49 inline void MarkAndPush(const EmbedderDataSlot type_slot, 50 const EmbedderDataSlot instance_slot); 51 IsLocalEmpty()52 bool IsLocalEmpty() { 53 return marking_state_.marking_worklist().IsLocalEmpty(); 54 } 55 56 private: 57 Isolate* const isolate_; 58 const WrapperDescriptor& wrapper_descriptor_; 59 60 std::unique_ptr<cppgc::internal::MarkingStateBase> owned_marking_state_; 61 cppgc::internal::MarkingStateBase& marking_state_; 62 }; 63 64 } // namespace internal 65 } // namespace v8 66 67 #endif // V8_HEAP_CPPGC_JS_CPP_MARKING_STATE_H_ 68