From 477c423be26d38fded3f032ef595ca5dea2953df Mon Sep 17 00:00:00 2001 From: zhangyukun Date: Thu, 9 Sep 2021 11:46:59 +0800 Subject: [PATCH] add function::new with deleter Signed-off-by: zhangyukun Change-Id: Ic0a743e95750ac10198f096d65470c9bf71b965c --- ecmascript/napi/include/jsnapi.h | 6 ++++-- ecmascript/napi/jsnapi.cpp | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/ecmascript/napi/include/jsnapi.h b/ecmascript/napi/include/jsnapi.h index ce23b0b860..323f573562 100644 --- a/ecmascript/napi/include/jsnapi.h +++ b/ecmascript/napi/include/jsnapi.h @@ -46,6 +46,7 @@ namespace ecmascript { class EcmaVM; } // namespace ecmascript +using Deleter = void (*)(void *buffer, void *data); using EcmaVM = ecmascript::EcmaVM; using JSTaggedType = uint64_t; static constexpr uint32_t DEFAULT_GC_POOL_SIZE = 256 * 1024 * 1024; @@ -514,7 +515,9 @@ using FunctionCallbackWithNewTarget = class PUBLIC_API FunctionRef : public ObjectRef { public: static Local New(EcmaVM *vm, FunctionCallback nativeFunc, void *data); - static Local NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, void *data); + static Local New(EcmaVM *vm, FunctionCallback nativeFunc, Deleter deleter, void *data); + static Local NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, Deleter deleter, + void *data); Local Call(const EcmaVM *vm, Local thisObj, const Local argv[], int32_t length); Local Constructor(const EcmaVM *vm, const Local argv[], int32_t length); @@ -547,7 +550,6 @@ public: Local GetPromise(const EcmaVM *vm); }; -using Deleter = void (*)(void *buffer, void *data); class PUBLIC_API ArrayBufferRef : public ObjectRef { public: static Local New(const EcmaVM *vm, int32_t length); diff --git a/ecmascript/napi/jsnapi.cpp b/ecmascript/napi/jsnapi.cpp index 1338190fad..ff7223a2c1 100644 --- a/ecmascript/napi/jsnapi.cpp +++ b/ecmascript/napi/jsnapi.cpp @@ -744,7 +744,22 @@ Local FunctionRef::New(EcmaVM *vm, FunctionCallback nativeFunc, voi return JSNApiHelper::ToLocal(JSHandle(current)); } -Local FunctionRef::NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, void *data) +Local FunctionRef::New(EcmaVM *vm, FunctionCallback nativeFunc, Deleter deleter, void *data) +{ + JSThread *thread = vm->GetJSThread(); + ObjectFactory *factory = vm->GetFactory(); + JSHandle env = vm->GetGlobalEnv(); + JSHandle current(factory->NewJSFunction(env, reinterpret_cast(Callback::RegisterCallback))); + JSHandle funcCallback = factory->NewJSNativePointer(reinterpret_cast(nativeFunc)); + JSHandle dataCaddress = factory->NewJSNativePointer(data, deleter, nullptr); + vm->PushToArrayDataList(*dataCaddress); + JSHandle extraInfo(factory->NewFunctionExtraInfo(funcCallback, dataCaddress)); + current->SetFunctionExtraInfo(thread, extraInfo.GetTaggedValue()); + return JSNApiHelper::ToLocal(JSHandle(current)); +} + +Local FunctionRef::NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, Deleter deleter, + void *data) { JSThread *thread = vm->GetJSThread(); ObjectFactory *factory = vm->GetFactory(); @@ -755,7 +770,13 @@ Local FunctionRef::NewClassFunction(EcmaVM *vm, FunctionCallbackWit JSHandle current = factory->NewJSFunctionByDynClass(method, dynclass, ecmascript::FunctionKind::CLASS_CONSTRUCTOR); JSHandle funcCallback = factory->NewJSNativePointer(reinterpret_cast(nativeFunc)); - JSHandle dataCaddress = factory->NewJSNativePointer(data); + JSHandle dataCaddress(thread, JSTaggedValue::Undefined()); + if (deleter == nullptr) { + dataCaddress = factory->NewJSNativePointer(data); + } else { + dataCaddress = factory->NewJSNativePointer(data, deleter, nullptr); + vm->PushToArrayDataList(*dataCaddress); + } JSHandle extraInfo(factory->NewFunctionExtraInfo(funcCallback, dataCaddress)); current->SetFunctionExtraInfo(thread, extraInfo.GetTaggedValue()); -- Gitee