diff --git a/ecmascript/napi/include/jsnapi.h b/ecmascript/napi/include/jsnapi.h index ce23b0b860c36734030ae82f893299e2097fb3a1..323f573562bd69f6e7919459af49c5bf544e1106 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 1338190fad8415cd0abaeefdb83d7b2f95a178fc..ff7223a2c16a133a312ca2b468d96e3d109e3034 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());