28 SanitizeNativeContextScope(Isolate* isolate,
29 Tagged<NativeContext> native_context,
30 bool allow_active_isolate_for_testing,
31 const DisallowGarbageCollection& no_gc)
34 if (!allow_active_isolate_for_testing) {
45 ->RawExternalPointerField(NativeContext::kMicrotaskQueueOffset,
46 kNativeContextMicrotaskQueueTag)
47 .GetAndClearContentForSerialization(no_gc);
50 ~SanitizeNativeContextScope() {
53 ->RawExternalPointerField(NativeContext::kMicrotaskQueueOffset,
54 kNativeContextMicrotaskQueueTag)
62 const DisallowGarbageCollection&
no_gc_;
72 startup_serializer_(startup_serializer),
73 serialize_embedder_fields_(
callback),
74 can_be_rehashed_(true) {
105 SanitizeNativeContextScope sanitize_native_context(
130 int index,
bool field_is_nullptr,
135 if (user_callback.
callback ==
nullptr && field_is_nullptr) {
140 return user_callback.
callback(api_obj, index, user_callback.
data);
144 int index,
bool field_is_nullptr,
151 if (user_callback.
callback ==
nullptr) {
155 return user_callback.
callback(api_obj, index, user_callback.
data);
195 DCHECK(!IsInternalizedString(*obj));
197 DCHECK(!IsTemplateInfo(*obj));
199 InstanceType instance_type = obj->map()->instance_type();
200 if (InstanceTypeChecker::IsFeedbackVector(instance_type)) {
203 }
else if (InstanceTypeChecker::IsJSObject(instance_type)) {
205 int embedder_fields_count = js_obj->GetEmbedderFieldCount();
206 if (embedder_fields_count > 0) {
213 user_callback, api_obj);
219 if (InstanceTypeChecker::IsJSFunction(instance_type)) {
224 if (closure->shared()->HasBytecodeArray()) {
227 closure->ResetIfCodeFlushed(
isolate());
228 if (closure->is_compiled(isolate())) {
229 if (closure->shared()->HasBaselineCode()) {
230 closure->shared()->FlushBaselineCode();
233 if (!sfi_code.
SafeEquals(closure->code(isolate()))) {
234 closure->UpdateCode(sfi_code);
238 }
else if (InstanceTypeChecker::IsEmbedderDataArray(instance_type) &&
242 int embedder_fields_count = embedder_data->length();
243 if (embedder_data->length() > 0) {
251 user_callback, api_obj);
270 return IsName(o) || IsScript(o) || IsSharedFunctionInfo(o) ||
271 IsHeapNumber(o) || IsCode(o) || IsInstructionStream(o) ||
272 IsScopeInfo(o) || IsAccessorInfo(o) || IsTemplateInfo(o) ||
273 IsClassPositions(o) ||
280 return IsInternalizedString(o);
284bool DataIsEmpty(
const StartupData& data) {
return data.raw_size == 0; }
290 auto* cpp_heap_pointer =
294 if (callback_data.callback ==
nullptr && cpp_heap_pointer ==
nullptr) {
300 const auto data = callback_data.callback(
301 v8::Utils::ToLocal(js_object), cpp_heap_pointer, callback_data.data);
302 if (DataIsEmpty(data)) {
313 data.raw_size,
"api wrapper raw field data");
316template <
typename V8Type,
typename UserSerializerWrapper,
317 typename UserCallback,
typename ApiObjectType>
320 UserSerializerWrapper wrapper, UserCallback user_callback,
321 ApiObjectType api_obj) {
324 DisallowJavascriptExecution no_js(
isolate());
325 DisallowCompilation no_compile(
isolate());
327 auto raw_obj = *data_holder;
329 std::vector<EmbedderDataSlot::RawData> original_embedder_values;
330 std::vector<StartupData> serialized_data;
331 std::vector<bool> should_clear_slot;
337 for (
int i = 0;
i < embedder_fields_count;
i++) {
339 original_embedder_values.emplace_back(slot.
load_raw(isolate(), no_gc));
343 serialized_data.push_back({
nullptr, 0});
344 should_clear_slot.push_back(
false);
347 wrapper(
i,
object ==
Smi::zero(), user_callback, api_obj);
348 serialized_data.push_back(data);
351 should_clear_slot.push_back(clear_slot);
358 for (
int i = 0;
i < embedder_fields_count;
i++) {
359 if (should_clear_slot[
i]) {
370 raw_obj = *data_holder;
381 for (
int i = 0;
i < embedder_fields_count;
i++) {
383 if (!should_clear_slot[
i])
continue;
387 if (DataIsEmpty(data))
continue;
394 data.raw_size,
"embedder fields data");
406 if (!obj->NeedsRehashing(
cage_base()))
return;
407 if (obj->CanBeRehashed(
cage_base()))
return;
SnapshotByteSink api_wrapper_sink_
void Serialize(Tagged< Context > *o, const DisallowGarbageCollection &no_gc)
void SerializeApiWrapperFields(DirectHandle< JSObject > js_object)
ContextSerializer(Isolate *isolate, Snapshot::SerializerFlags flags, StartupSerializer *startup_serializer, SerializeEmbedderFieldsCallback callback)
void SerializeObjectWithEmbedderFields(Handle< V8Type > data_holder, int embedder_fields_count, UserSerializerWrapper wrapper, UserCallback user_callback, ApiObjectType api_obj)
SnapshotByteSink embedder_fields_sink_
void SerializeObjectImpl(Handle< HeapObject > o, SlotType slot_type) override
SerializeEmbedderFieldsCallback serialize_embedder_fields_
void CheckRehashability(Tagged< HeapObject > obj)
Tagged< Context > context_
bool ShouldBeInTheSharedObjectCache(Tagged< HeapObject > o)
bool ShouldBeInTheStartupObjectCache(Tagged< HeapObject > o)
~ContextSerializer() override
StartupSerializer * startup_serializer_
V8_INLINE void store_raw(IsolateForSandbox isolate, RawData data, const DisallowGarbageCollection &no_gc)
V8_INLINE Tagged< Object > load_tagged() const
V8_INLINE bool MustClearDuringSerialization(const DisallowGarbageCollection &no_gc)
V8_INLINE RawData load_raw(IsolateForSandbox isolate, const DisallowGarbageCollection &no_gc) const
Handle< NativeContext > native_context()
V8_INLINE void * GetCppHeapWrappable(IsolateForPointerCompression isolate) const
static void ResetContext(Tagged< Context > native_context)
virtual void VisitRootPointer(Root root, const char *description, FullObjectSlot p)
const SerializerReference * LookupReference(Tagged< HeapObject > object) const
SerializerReference AddAttachedReference(Tagged< HeapObject > object)
bool is_back_reference() const
uint32_t back_ref_index() const
void Serialize(SlotType slot_type)
bool ReferenceMapContains(DirectHandle< HeapObject > o)
void InitializeCodeAddressMap()
PtrComprCageBase cage_base() const
bool ObjectIsBytecodeHandler(Tagged< HeapObject > obj) const
Isolate * isolate() const
void SerializeDeferredObjects()
bool SerializeRoot(Tagged< HeapObject > obj)
bool SerializeReadOnlyObjectReference(Tagged< HeapObject > obj, SnapshotByteSink *sink)
void OutputStatistics(const char *name)
void Pad(int padding_offset=0)
bool allow_active_isolate_for_testing() const
SerializerReferenceMap * reference_map()
bool SerializeHotObject(Tagged< HeapObject > obj)
bool SerializeBackReference(Tagged< HeapObject > obj)
static constexpr Tagged< Smi > zero()
void Append(const SnapshotByteSink &other)
void PutUint30(uint32_t integer, const char *description)
void PutRaw(const uint8_t *data, int number_of_bytes, const char *description)
void Put(uint8_t b, const char *description)
const std::vector< uint8_t > * data() const
void SerializeUsingStartupObjectCache(SnapshotByteSink *sink, Handle< HeapObject > obj)
bool SerializeUsingSharedHeapObjectCache(SnapshotByteSink *sink, Handle< HeapObject > obj)
constexpr bool SafeEquals(TaggedImpl< kOtherRefType, StorageType > other) const
Tagged< NativeContext > native_context_
ExternalPointerSlot::RawContent microtask_queue_external_pointer_
MicrotaskQueue * microtask_queue
DisallowGarbageCollection no_gc_
v8::StartupData ContextDataSerializeWrapper(int index, bool field_is_nullptr, v8::SerializeContextDataCallback user_callback, v8::Local< v8::Context > api_obj)
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
bool IsJSApiWrapperObject(Tagged< Map > map)
static constexpr Address kNullAddress
V8_WARN_UNUSED_RESULT bool IsValidHeapObject(Heap *heap, Tagged< HeapObject > object)
v8::StartupData InternalFieldSerializeWrapper(int index, bool field_is_nullptr, v8::SerializeInternalFieldsCallback user_callback, v8::Local< v8::Object > api_obj)
!IsContextMap !IsContextMap native_context
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
constexpr CppHeapPointerTagRange kAnyCppHeapPointer(CppHeapPointerTag::kFirstTag, CppHeapPointerTag::kLastTag)
#define CHECK_GT(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
CallbackFunction callback
CallbackFunction callback
v8::SerializeContextDataCallback context_callback
v8::SerializeAPIWrapperCallback api_wrapper_callback
v8::SerializeInternalFieldsCallback js_object_callback