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_H 17 #define ECMASCRIPT_SERIALIZER_BASE_SERIALIZER_H 18 19 #include "ecmascript/mem/object_xray.h" 20 #include "ecmascript/serializer/serialize_chunk.h" 21 #include "ecmascript/serializer/serialize_data.h" 22 23 namespace panda::ecmascript { 24 25 class Ecmavm; 26 class JSThread; 27 class BaseSerializer { 28 public: BaseSerializer(JSThread * thread)29 explicit BaseSerializer(JSThread *thread) : thread_(thread), vm_(thread->GetEcmaVM()) 30 { 31 data_.reset(new SerializeData(thread)); 32 sharedObjChunk_.reset(new SerializationChunk()); 33 } ~BaseSerializer()34 virtual ~BaseSerializer() 35 { 36 referenceMap_.clear(); 37 } 38 NO_COPY_SEMANTIC(BaseSerializer); 39 NO_MOVE_SEMANTIC(BaseSerializer); 40 41 void SerializeJSTaggedValue(JSTaggedValue value); Release()42 std::unique_ptr<SerializeData> Release() 43 { 44 return std::move(data_); 45 } 46 47 protected: 48 template <SerializeType serializeType> 49 class SerializeObjectFieldVisitor final : 50 public EcmaObjectRangeVisitor<SerializeObjectFieldVisitor<serializeType>> { 51 public: 52 explicit SerializeObjectFieldVisitor(BaseSerializer *serializer); 53 ~SerializeObjectFieldVisitor() override = default; 54 55 void VisitObjectRangeImpl(TaggedObject *root, ObjectSlot start, ObjectSlot end, VisitObjectArea area) override; 56 private: 57 BaseSerializer *serializer_ {nullptr}; 58 }; 59 // Different serialize mode can implement this interface to custom processing 60 virtual void SerializeObjectImpl(TaggedObject *object, bool isWeak = false) = 0; 61 void WriteMultiRawData(uintptr_t beginAddr, size_t fieldSize); 62 template<SerializeType serializeType> 63 void SerializeTaggedObject(TaggedObject *object); 64 bool SerializeReference(TaggedObject *object); 65 bool SerializeRootObject(TaggedObject *object); 66 void SerializeSharedObject(TaggedObject *object); 67 template<SerializeType serializeType> 68 void SerializeObjectField(TaggedObject *object); 69 bool SerializeSpecialObjIndividually(JSType objectType, TaggedObject *root, ObjectSlot start, ObjectSlot end); 70 void SerializeHClassFieldIndividually(TaggedObject *root, ObjectSlot start, ObjectSlot end); 71 void SerializeSFunctionFieldIndividually(TaggedObject *root, ObjectSlot start, ObjectSlot end); 72 void SerializeSFunctionModule(JSFunction *func); 73 void SerializeLexicalEnvFieldIndividually(TaggedObject *root, ObjectSlot start, ObjectSlot end); 74 void SerializeSendableEnvFieldIndividually(TaggedObject *root, ObjectSlot start, ObjectSlot end); 75 void SerializeAsyncFunctionFieldIndividually(TaggedObject *root, ObjectSlot start, ObjectSlot end); 76 void SerializeObjectProto(JSHClass *kclass, JSTaggedValue proto); 77 void SerializeTaggedObjField(SerializeType serializeType, TaggedObject *root, ObjectSlot start, ObjectSlot end); 78 void SerializeInObjField(TaggedObject *object, ObjectSlot start, ObjectSlot end); 79 SerializedObjectSpace GetSerializedObjectSpace(TaggedObject *object) const; 80 81 protected: 82 JSThread *thread_; 83 EcmaVM *vm_; 84 std::unique_ptr<SerializeData> data_; 85 std::unique_ptr<SerializationChunk> sharedObjChunk_; 86 CUnorderedMap<TaggedObject *, uint32_t> referenceMap_; 87 size_t objectIndex_ {0}; 88 static constexpr size_t PARENT_ENV_SLOT = sizeof(TaggedObject); 89 static constexpr size_t SCOPE_INFO_SLOT = PARENT_ENV_SLOT * 2; // 2: the second object slot of lexical env 90 int32_t serializeSharedEvent_ = 0; 91 }; 92 } 93 94 #endif // ECMASCRIPT_SERIALIZER_BASE_SERIALIZER_H