1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef ECMASCRIPT_SERIALIZER_BASE_SERIALIZER_INL_H
17 #define ECMASCRIPT_SERIALIZER_BASE_SERIALIZER_INL_H
18
19 #include "ecmascript/serializer/base_serializer.h"
20
21 namespace panda::ecmascript {
22
23 template <SerializeType serializeType>
SerializeObjectFieldVisitor(BaseSerializer * serializer)24 BaseSerializer::SerializeObjectFieldVisitor<serializeType>::SerializeObjectFieldVisitor(BaseSerializer *serializer)
25 : serializer_(serializer) {}
26
27 template <SerializeType serializeType>
VisitObjectRangeImpl(BaseObject * rootObject,uintptr_t startAddr,uintptr_t endAddr,VisitObjectArea area)28 void BaseSerializer::SerializeObjectFieldVisitor<serializeType>::VisitObjectRangeImpl(BaseObject *rootObject,
29 uintptr_t startAddr, uintptr_t endAddr, VisitObjectArea area)
30 {
31 JSThread *thread = serializer_->GetThread();
32 switch (area) {
33 case VisitObjectArea::RAW_DATA:
34 serializer_->WriteMultiRawData(startAddr, endAddr - startAddr);
35 break;
36 case VisitObjectArea::NATIVE_POINTER:
37 if (serializeType == SerializeType::VALUE_SERIALIZE) {
38 serializer_->WriteMultiRawData(startAddr, endAddr - startAddr);
39 }
40 break;
41 case VisitObjectArea::IN_OBJECT: {
42 serializer_->SerializeInObjField(TaggedObject::Cast(rootObject), ObjectSlot(startAddr),
43 ObjectSlot(endAddr));
44 break;
45 }
46 default: {
47 ObjectSlot end = ObjectSlot(endAddr);
48 for (ObjectSlot slot = ObjectSlot(startAddr); slot < end; slot++) {
49 [[maybe_unused]] JSTaggedValue value =
50 JSTaggedValue(Barriers::GetTaggedValue(thread, slot.SlotAddress()));
51 }
52 serializer_->SerializeTaggedObjField(serializeType, TaggedObject::Cast(rootObject), ObjectSlot(startAddr),
53 ObjectSlot(endAddr));
54 break;
55 }
56 }
57 }
58
59 template <SerializeType serializeType>
VisitObjectHClassImpl(BaseObject * hclass)60 void BaseSerializer::SerializeObjectFieldVisitor<serializeType>::VisitObjectHClassImpl(BaseObject *hclass)
61 {
62 serializer_->SerializeJSTaggedValue(JSTaggedValue(TaggedObject::Cast(hclass)));
63 }
64
65 template<SerializeType serializeType>
SerializeObjectField(TaggedObject * object)66 void BaseSerializer::SerializeObjectField(TaggedObject *object)
67 {
68 SerializeObjectFieldVisitor<serializeType> serializeObjectFieldVisitor(this);
69 ObjectXRay::VisitObjectBody<VisitType::ALL_VISIT>(object, object->GetClass(), serializeObjectFieldVisitor);
70 }
71
72 template<SerializeType serializeType>
SerializeTaggedObject(TaggedObject * object)73 void BaseSerializer::SerializeTaggedObject(TaggedObject *object)
74 {
75 size_t objectSize = object->GetSize();
76 SerializedObjectSpace space = GetSerializedObjectSpace(object);
77 data_->WriteUint8(SerializeData::EncodeNewObject(space));
78 data_->WriteUint32(objectSize);
79 data_->CalculateSerializedObjectSize(space, objectSize);
80 referenceMap_.emplace(object, objectIndex_++);
81
82 SerializeObjectField<serializeType>(object);
83 }
84 }
85
86 #endif // ECMASCRIPT_SERIALIZER_BASE_SERIALIZER_INL_H
87