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_INL_H_
6 #define V8_HEAP_CPPGC_JS_CPP_MARKING_STATE_INL_H_
7 
8 #include "src/heap/cppgc-js/cpp-marking-state.h"
9 #include "src/heap/embedder-tracing-inl.h"
10 #include "src/objects/embedder-data-slot.h"
11 #include "src/objects/js-objects.h"
12 
13 namespace v8 {
14 namespace internal {
15 
ExtractEmbedderDataSnapshot( Map map, JSObject object, EmbedderDataSnapshot& snapshot)16 bool CppMarkingState::ExtractEmbedderDataSnapshot(
17     Map map, JSObject object, EmbedderDataSnapshot& snapshot) {
18   if (JSObject::GetEmbedderFieldCount(map) < 2) return false;
19 
20   EmbedderDataSlot::PopulateEmbedderDataSnapshot(
21       map, object, wrapper_descriptor_.wrappable_type_index, snapshot.first);
22   EmbedderDataSlot::PopulateEmbedderDataSnapshot(
23       map, object, wrapper_descriptor_.wrappable_instance_index,
24       snapshot.second);
25   return true;
26 }
27 
MarkAndPush(const EmbedderDataSnapshot& snapshot)28 void CppMarkingState::MarkAndPush(const EmbedderDataSnapshot& snapshot) {
29   const EmbedderDataSlot type_slot(snapshot.first);
30   const EmbedderDataSlot instance_slot(snapshot.second);
31   MarkAndPush(type_slot, instance_slot);
32 }
33 
MarkAndPush(const EmbedderDataSlot type_slot, const EmbedderDataSlot instance_slot)34 void CppMarkingState::MarkAndPush(const EmbedderDataSlot type_slot,
35                                   const EmbedderDataSlot instance_slot) {
36   LocalEmbedderHeapTracer::WrapperInfo info;
37   if (LocalEmbedderHeapTracer::ExtractWrappableInfo(
38           isolate_, wrapper_descriptor_, type_slot, instance_slot, &info)) {
39     marking_state_.MarkAndPush(
40         cppgc::internal::HeapObjectHeader::FromObject(info.second));
41   }
42 }
43 
44 }  // namespace internal
45 }  // namespace v8
46 
47 #endif  // V8_HEAP_CPPGC_JS_CPP_MARKING_STATE_INL_H_
48