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#ifndef V8_HEAP_EMBEDDER_TRACING_INL_H_ 5#define V8_HEAP_EMBEDDER_TRACING_INL_H_ 6 7#include "src/heap/embedder-tracing.h" 8#include "src/objects/embedder-data-slot.h" 9#include "src/objects/js-objects-inl.h" 10 11namespace v8 { 12namespace internal { 13 14// static 15bool LocalEmbedderHeapTracer::ExtractWrappableInfo( 16 Isolate* isolate, JSObject js_object, 17 const WrapperDescriptor& wrapper_descriptor, WrapperInfo* info) { 18 DCHECK(js_object.MayHaveEmbedderFields()); 19 if (js_object.GetEmbedderFieldCount() < 2) return false; 20 21 return ExtractWrappableInfo( 22 isolate, wrapper_descriptor, 23 EmbedderDataSlot(js_object, wrapper_descriptor.wrappable_type_index), 24 EmbedderDataSlot(js_object, wrapper_descriptor.wrappable_instance_index), 25 info); 26} 27 28// static 29bool LocalEmbedderHeapTracer::ExtractWrappableInfo( 30 Isolate* isolate, const WrapperDescriptor& wrapper_descriptor, 31 const EmbedderDataSlot& type_slot, const EmbedderDataSlot& instance_slot, 32 WrapperInfo* info) { 33 if (type_slot.ToAlignedPointer(isolate, &info->first) && info->first && 34 instance_slot.ToAlignedPointer(isolate, &info->second) && info->second) { 35 return (wrapper_descriptor.embedder_id_for_garbage_collected == 36 WrapperDescriptor::kUnknownEmbedderId) || 37 (*static_cast<uint16_t*>(info->first) == 38 wrapper_descriptor.embedder_id_for_garbage_collected); 39 } 40 return false; 41} 42 43} // namespace internal 44} // namespace v8 45 46#endif // V8_HEAP_EMBEDDER_TRACING_INL_H_ 47