|  | // Copyright 2020 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef V8_HEAP_CPPGC_JS_UNIFIED_HEAP_MARKING_STATE_H_ | 
|  | #define V8_HEAP_CPPGC_JS_UNIFIED_HEAP_MARKING_STATE_H_ | 
|  |  | 
|  | #include "include/v8-cppgc.h" | 
|  | #include "include/v8.h" | 
|  | #include "src/heap/heap.h" | 
|  |  | 
|  | namespace v8 { | 
|  |  | 
|  | namespace internal { | 
|  |  | 
|  | class BasicTracedReferenceExtractor { | 
|  | public: | 
|  | static Address* ObjectReference(const TracedReferenceBase& ref) { | 
|  | return reinterpret_cast<Address*>(ref.val_); | 
|  | } | 
|  | }; | 
|  |  | 
|  | class UnifiedHeapMarkingState { | 
|  | public: | 
|  | explicit UnifiedHeapMarkingState(Heap& heap) : heap_(heap) {} | 
|  |  | 
|  | UnifiedHeapMarkingState(const UnifiedHeapMarkingState&) = delete; | 
|  | UnifiedHeapMarkingState& operator=(const UnifiedHeapMarkingState&) = delete; | 
|  |  | 
|  | inline void MarkAndPush(const TracedReferenceBase&); | 
|  |  | 
|  | private: | 
|  | Heap& heap_; | 
|  | }; | 
|  |  | 
|  | void UnifiedHeapMarkingState::MarkAndPush(const TracedReferenceBase& ref) { | 
|  | heap_.RegisterExternallyReferencedObject( | 
|  | BasicTracedReferenceExtractor::ObjectReference(ref)); | 
|  | } | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace v8 | 
|  |  | 
|  | #endif  // V8_HEAP_CPPGC_JS_UNIFIED_HEAP_MARKING_STATE_H_ |