add function::new with deleter

Signed-off-by: zhangyukun <zhangyukun8@huawei.com>

Change-Id: Ic0a743e95750ac10198f096d65470c9bf71b965c
This commit is contained in:
zhangyukun 2021-09-09 11:46:59 +08:00
parent e89dc0131f
commit 477c423be2
2 changed files with 27 additions and 4 deletions

View File

@ -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<FunctionRef> New(EcmaVM *vm, FunctionCallback nativeFunc, void *data);
static Local<FunctionRef> NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, void *data);
static Local<FunctionRef> New(EcmaVM *vm, FunctionCallback nativeFunc, Deleter deleter, void *data);
static Local<FunctionRef> NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, Deleter deleter,
void *data);
Local<JSValueRef> Call(const EcmaVM *vm, Local<JSValueRef> thisObj, const Local<JSValueRef> argv[],
int32_t length);
Local<JSValueRef> Constructor(const EcmaVM *vm, const Local<JSValueRef> argv[], int32_t length);
@ -547,7 +550,6 @@ public:
Local<PromiseRef> GetPromise(const EcmaVM *vm);
};
using Deleter = void (*)(void *buffer, void *data);
class PUBLIC_API ArrayBufferRef : public ObjectRef {
public:
static Local<ArrayBufferRef> New(const EcmaVM *vm, int32_t length);

View File

@ -744,7 +744,22 @@ Local<FunctionRef> FunctionRef::New(EcmaVM *vm, FunctionCallback nativeFunc, voi
return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
}
Local<FunctionRef> FunctionRef::NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, void *data)
Local<FunctionRef> FunctionRef::New(EcmaVM *vm, FunctionCallback nativeFunc, Deleter deleter, void *data)
{
JSThread *thread = vm->GetJSThread();
ObjectFactory *factory = vm->GetFactory();
JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
JSHandle<JSFunction> current(factory->NewJSFunction(env, reinterpret_cast<void *>(Callback::RegisterCallback)));
JSHandle<JSNativePointer> funcCallback = factory->NewJSNativePointer(reinterpret_cast<void *>(nativeFunc));
JSHandle<JSNativePointer> dataCaddress = factory->NewJSNativePointer(data, deleter, nullptr);
vm->PushToArrayDataList(*dataCaddress);
JSHandle<JSFunctionExtraInfo> extraInfo(factory->NewFunctionExtraInfo(funcCallback, dataCaddress));
current->SetFunctionExtraInfo(thread, extraInfo.GetTaggedValue());
return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
}
Local<FunctionRef> FunctionRef::NewClassFunction(EcmaVM *vm, FunctionCallbackWithNewTarget nativeFunc, Deleter deleter,
void *data)
{
JSThread *thread = vm->GetJSThread();
ObjectFactory *factory = vm->GetFactory();
@ -755,7 +770,13 @@ Local<FunctionRef> FunctionRef::NewClassFunction(EcmaVM *vm, FunctionCallbackWit
JSHandle<JSFunction> current =
factory->NewJSFunctionByDynClass(method, dynclass, ecmascript::FunctionKind::CLASS_CONSTRUCTOR);
JSHandle<JSNativePointer> funcCallback = factory->NewJSNativePointer(reinterpret_cast<void *>(nativeFunc));
JSHandle<JSNativePointer> dataCaddress = factory->NewJSNativePointer(data);
JSHandle<JSNativePointer> dataCaddress(thread, JSTaggedValue::Undefined());
if (deleter == nullptr) {
dataCaddress = factory->NewJSNativePointer(data);
} else {
dataCaddress = factory->NewJSNativePointer(data, deleter, nullptr);
vm->PushToArrayDataList(*dataCaddress);
}
JSHandle<JSFunctionExtraInfo> extraInfo(factory->NewFunctionExtraInfo(funcCallback, dataCaddress));
current->SetFunctionExtraInfo(thread, extraInfo.GetTaggedValue());