From a996afa9c3fb5f62ccf08d1b33fae64620dd349c Mon Sep 17 00:00:00 2001 From: lijiamin2019 Date: Tue, 18 Jun 2024 11:00:59 +0800 Subject: [PATCH] Support arraybuffer/typedarray set int clonList. Signed-off-by: lijiamin2019 Change-Id: I35a9d46a28b49c7c65bcab15ae9e80c7091b9ecb --- ecmascript/ecma_context.h | 1 - ecmascript/serializer/base_deserializer.cpp | 1 + ecmascript/serializer/serialize_data.h | 1 + ecmascript/serializer/value_serializer.cpp | 31 +++++++++++++++++++++ ecmascript/serializer/value_serializer.h | 1 + 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ecmascript/ecma_context.h b/ecmascript/ecma_context.h index 282409b5e0..b35d1e2c50 100644 --- a/ecmascript/ecma_context.h +++ b/ecmascript/ecma_context.h @@ -667,7 +667,6 @@ private: EcmaRuntimeStat *runtimeStat_ {nullptr}; CMap> cachedSharedConstpools_ {}; - // todo(lijiamin) Consider expanding capacity. std::array unsharedConstpools_ {}; static constexpr int32_t SHARED_CONSTPOOL_KEY_NOT_FOUND = INT32_MAX; // INT32_MAX :invalid value. diff --git a/ecmascript/serializer/base_deserializer.cpp b/ecmascript/serializer/base_deserializer.cpp index 8c9918da50..0fbe82602d 100644 --- a/ecmascript/serializer/base_deserializer.cpp +++ b/ecmascript/serializer/base_deserializer.cpp @@ -297,6 +297,7 @@ size_t BaseDeserializer::ReadSingleEncodeData(uint8_t encodeFlag, uintptr_t objA break; } case (uint8_t)EncodeFlag::ARRAY_BUFFER: + case (uint8_t)EncodeFlag::SENDABLE_ARRAY_BUFFER: case (uint8_t)EncodeFlag::JS_REG_EXP: { size_t bufferLength = data_->ReadUint32(position_); auto nativeAreaAllocator = thread_->GetEcmaVM()->GetNativeAreaAllocator(); diff --git a/ecmascript/serializer/serialize_data.h b/ecmascript/serializer/serialize_data.h index 618331293b..d658648ad1 100644 --- a/ecmascript/serializer/serialize_data.h +++ b/ecmascript/serializer/serialize_data.h @@ -45,6 +45,7 @@ enum class EncodeFlag : uint8_t { ARRAY_BUFFER, TRANSFER_ARRAY_BUFFER, SHARED_ARRAY_BUFFER, + SENDABLE_ARRAY_BUFFER, NATIVE_BINDING_OBJECT, JS_ERROR, JS_REG_EXP, diff --git a/ecmascript/serializer/value_serializer.cpp b/ecmascript/serializer/value_serializer.cpp index 82618d2573..42a1b1ac78 100644 --- a/ecmascript/serializer/value_serializer.cpp +++ b/ecmascript/serializer/value_serializer.cpp @@ -184,6 +184,11 @@ void ValueSerializer::SerializeObjectImpl(TaggedObject *object, bool isWeak) SerializeJSSharedArrayBufferPrologue(object); break; } + case JSType::JS_SENDABLE_ARRAY_BUFFER: { + supportJSNativePointer_ = true; + SerializeJSSendableArrayBufferPrologue(object); + break; + } case JSType::JS_ARRAY: { JSArray *array = reinterpret_cast(object); trackInfo = array->GetTrackInfo(); @@ -211,6 +216,7 @@ void ValueSerializer::SerializeObjectImpl(TaggedObject *object, bool isWeak) switch (type) { case JSType::JS_ARRAY_BUFFER: case JSType::JS_SHARED_ARRAY_BUFFER: + case JSType::JS_SENDABLE_ARRAY_BUFFER: case JSType::JS_REG_EXP: // JSNativePointer supports serialization only during serialize JSArrayBuffer, // JSSharedArrayBuffer and JSRegExp @@ -368,6 +374,31 @@ void ValueSerializer::SerializeJSSharedArrayBufferPrologue(TaggedObject *object) } } +void ValueSerializer::SerializeJSSendableArrayBufferPrologue(TaggedObject *object) +{ + ASSERT(object->GetClass()->IsSendableArrayBuffer()); + JSSendableArrayBuffer *arrayBuffer = reinterpret_cast(object); + if (arrayBuffer->IsDetach()) { + LOG_ECMA(ERROR) << "ValueSerialize: don't support serialize detached sendable array buffer"; + notSupport_ = true; + return; + } + size_t arrayLength = arrayBuffer->GetArrayBufferByteLength(); + if (arrayLength > 0) { + bool nativeAreaAllocated = arrayBuffer->GetWithNativeAreaAllocator(); + if (!nativeAreaAllocated) { + LOG_ECMA(ERROR) << "ValueSerialize: don't support clone sendablearraybuffer has external allocated buffer"; + notSupport_ = true; + return; + } + data_->WriteEncodeFlag(EncodeFlag::SENDABLE_ARRAY_BUFFER); + data_->WriteUint32(arrayLength); + JSNativePointer *np = + reinterpret_cast(arrayBuffer->GetArrayBufferData().GetTaggedObject()); + data_->WriteRawData(static_cast(np->GetExternalPointer()), arrayLength); + } +} + void ValueSerializer::SerializeJSRegExpPrologue(JSRegExp *jsRegExp) { uint32_t bufferSize = jsRegExp->GetLength(); diff --git a/ecmascript/serializer/value_serializer.h b/ecmascript/serializer/value_serializer.h index adab534f03..a93988f0b2 100644 --- a/ecmascript/serializer/value_serializer.h +++ b/ecmascript/serializer/value_serializer.h @@ -43,6 +43,7 @@ private: void SerializeNativeBindingObject(TaggedObject *object); bool SerializeJSArrayBufferPrologue(TaggedObject *object); void SerializeJSSharedArrayBufferPrologue(TaggedObject *object); + void SerializeJSSendableArrayBufferPrologue(TaggedObject *object); void SerializeJSRegExpPrologue(JSRegExp *jsRegExp); void InitTransferSet(CUnorderedSet transferDataSet); bool PrepareTransfer(JSThread *thread, const JSHandle &transfer);