diff --git a/ecmascript/napi/include/jsnapi_expo.h b/ecmascript/napi/include/jsnapi_expo.h index c48f47c2a8448a0dc516b7e2076e3892d86a2026..e936dcc11d50d07ab1e1123a400f32590c5108ed 100644 --- a/ecmascript/napi/include/jsnapi_expo.h +++ b/ecmascript/napi/include/jsnapi_expo.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -1129,6 +1130,13 @@ public: void Detach(const EcmaVM *vm); bool IsDetach(const EcmaVM *vm); + + std::tuple GetFinalizer(const EcmaVM *vm); + void SetFinalizer(const EcmaVM *vm, NativePointerCallback finalizer, + void *finalizerHint); + + void DetachForTransferring(const EcmaVM *vm); + bool GetWithNativeAreaAllocator(const EcmaVM *vm); }; class PUBLIC_API SendableArrayBufferRef : public ObjectRef { diff --git a/ecmascript/napi/jsnapi_expo.cpp b/ecmascript/napi/jsnapi_expo.cpp index f98cc9802e8e7ca424be191ff9729f6ee223a267..2d535b791d983cc9809096857fca5de14709da56 100644 --- a/ecmascript/napi/jsnapi_expo.cpp +++ b/ecmascript/napi/jsnapi_expo.cpp @@ -14,6 +14,7 @@ */ #include +#include #include "ecmascript/base/json_stringifier.h" #include "ecmascript/base/typed_array_helper-inl.h" @@ -3239,6 +3240,14 @@ void *ArrayBufferRef::GetBuffer(const EcmaVM *vm) return JSNativePointer::Cast(bufferData.GetTaggedObject())->GetExternalPointer(); } +void ArrayBufferRef::DetachForTransferring(const EcmaVM *vm) { + CROSS_THREAD_AND_EXCEPTION_CHECK(vm); + ecmascript::ThreadManagedScope managedScope(thread); + // arraybuffer is not shared. Do not need to switch state + JSHandle arrayBuffer(JSNApiHelper::ToJSHandle(this)); + arrayBuffer->Detach(thread, arrayBuffer->GetWithNativeAreaAllocator()); +} + void ArrayBufferRef::Detach(const EcmaVM *vm) { CROSS_THREAD_AND_EXCEPTION_CHECK(vm); @@ -3256,6 +3265,59 @@ bool ArrayBufferRef::IsDetach(const EcmaVM *vm) return arrayBuffer->IsDetach(); } +bool ArrayBufferRef::GetWithNativeAreaAllocator(const EcmaVM *vm) { + DCHECK_SPECIAL_VALUE_WITH_RETURN(this, false); + + ecmascript::ThreadManagedScope managedScope(vm->GetJSThread()); + JSHandle arrayBuffer(JSNApiHelper::ToJSHandle(this)); + + return arrayBuffer->GetWithNativeAreaAllocator(); +} + +std::tuple ArrayBufferRef::GetFinalizer( + const EcmaVM *vm) { + DCHECK_SPECIAL_VALUE_WITH_RETURN(this, std::make_tuple(nullptr, nullptr)); + + ecmascript::ThreadManagedScope managedScope(vm->GetJSThread()); + JSHandle arrayBuffer(JSNApiHelper::ToJSHandle(this)); + + JSTaggedValue bufferData = arrayBuffer->GetArrayBufferData(); + if (!bufferData.IsJSNativePointer()) { + return std::make_tuple(nullptr, nullptr); + } + + auto deleter = + JSNativePointer::Cast(bufferData.GetTaggedObject())->GetDeleter(); + auto data = JSNativePointer::Cast(bufferData.GetTaggedObject())->GetData(); + + // TODO ROCK: Set data and deleter to nullptr?????? + JSNativePointer::Cast(bufferData.GetTaggedObject())->SetData(nullptr); + JSNativePointer::Cast(bufferData.GetTaggedObject())->SetDeleter(nullptr); + + return std::make_tuple(deleter, data); +} + +void ArrayBufferRef::SetFinalizer(const EcmaVM *vm, + NativePointerCallback finalizer, + void *finalizerHint) { + DCHECK_SPECIAL_VALUE(this); + + ecmascript::ThreadManagedScope managedScope(vm->GetJSThread()); + JSHandle arrayBuffer(JSNApiHelper::ToJSHandle(this)); + + JSTaggedValue bufferData = arrayBuffer->GetArrayBufferData(); + if (!bufferData.IsJSNativePointer()) { + return; + } + + auto deleter = + JSNativePointer::Cast(bufferData.GetTaggedObject())->GetDeleter(); + auto data = JSNativePointer::Cast(bufferData.GetTaggedObject())->GetData(); + + JSNativePointer::Cast(bufferData.GetTaggedObject())->SetDeleter(finalizer); + JSNativePointer::Cast(bufferData.GetTaggedObject())->SetData(finalizerHint); +} + Local SendableArrayBufferRef::New(const EcmaVM *vm, int32_t length) { CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));