From 20fc6fdce4c329971501e8287f158dc7b64902dd Mon Sep 17 00:00:00 2001 From: guobingbing Date: Wed, 6 Apr 2022 19:38:57 +0800 Subject: [PATCH] FFI optimization for call params Signed-off-by: guobingbing Change-Id: I252e2e363156decbb7ecb6e52f8df8521d548760 --- .../engine/bindings_defines.h | 18 +- .../declarative_frontend/engine/js_types.cpp | 6 +- .../declarative_frontend/engine/js_types.h | 2 +- .../engine/jsi/jsi_bindings.h | 44 +--- .../engine/jsi/jsi_bindings.inl | 120 +++++---- .../engine/jsi/jsi_types.cpp | 28 +-- .../engine/jsi/jsi_types.h | 13 +- .../engine/jsi/jsi_types.inl | 2 +- .../engine/jsi/jsi_view_register.cpp | 227 ++++++++++-------- .../js_frontend/engine/jsi/ark_js_runtime.cpp | 24 +- .../js_frontend/engine/jsi/ark_js_runtime.h | 8 +- 11 files changed, 236 insertions(+), 256 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/engine/bindings_defines.h b/frameworks/bridge/declarative_frontend/engine/bindings_defines.h index c1da2620..7c3e3f41 100644 --- a/frameworks/bridge/declarative_frontend/engine/bindings_defines.h +++ b/frameworks/bridge/declarative_frontend/engine/bindings_defines.h @@ -83,21 +83,15 @@ constexpr const JavascriptEngine cCurrentJSEngine = JavascriptEngine::V8; #include "ecmascript/napi/include/jsnapi.h" using BindingTarget = panda::Local; -using FunctionCallback = panda::Local(*)( - panda::EcmaVM*, panda::Local, const panda::Local [], int32_t, void*); -using FunctionGetCallback = panda::Local(*)( - panda::EcmaVM*, panda::Local, const panda::Local [], int32_t, void*); -using FunctionSetCallback = panda::Local(*)( - panda::EcmaVM*, panda::Local, const panda::Local [], int32_t, void*); +using FunctionCallback = panda::Local(*)(panda::JsiRuntimeCallInfo*); +using FunctionGetCallback = panda::Local(*)(panda::JsiRuntimeCallInfo*); +using FunctionSetCallback = panda::Local(*)(panda::JsiRuntimeCallInfo*); template -using MemberFunctionCallback = panda::Local(T::*)( - panda::EcmaVM*, panda::Local, const panda::Local [], int32_t, void*); +using MemberFunctionCallback = panda::Local(T::*)(panda::JsiRuntimeCallInfo*); template -using MemberFunctionGetCallback = panda::Local(T::*)( - panda::EcmaVM*, panda::Local, const panda::Local [], int32_t, void*); +using MemberFunctionGetCallback = panda::Local(T::*)(panda::JsiRuntimeCallInfo*); template -using MemberFunctionSetCallback = panda::Local(T::*)( - panda::EcmaVM*, panda::Local, const panda::Local [], int32_t, void*); +using MemberFunctionSetCallback = panda::Local(T::*)(panda::JsiRuntimeCallInfo*); using ExoticGetterCallback = int; using ExoticSetterCallback = int; using ExoticHasPropertyCallback = int; diff --git a/frameworks/bridge/declarative_frontend/engine/js_types.cpp b/frameworks/bridge/declarative_frontend/engine/js_types.cpp index db1ae140..199751f0 100644 --- a/frameworks/bridge/declarative_frontend/engine/js_types.cpp +++ b/frameworks/bridge/declarative_frontend/engine/js_types.cpp @@ -39,15 +39,15 @@ JSValue JsStopPropagation(JSContext* ctx, JSValueConst new_target, int argc, JSV } #elif USE_ARK_ENGINE -Local JsStopPropagation( - EcmaVM* vm, Local thisObj, const Local argv[], int32_t argc, void* data) +Local JsStopPropagation(panda::JsiRuntimeCallInfo *info) { + Local thisObj = info->GetThisRef(); auto eventInfo = static_cast(panda::Local(thisObj)->GetNativePointerField(0)); if (eventInfo) { LOGD("JsStopPropagation is trigger"); eventInfo->SetStopPropagation(true); } - return JSValueRef::Undefined(vm); + return JSValueRef::Undefined(info->GetVM()); } #endif diff --git a/frameworks/bridge/declarative_frontend/engine/js_types.h b/frameworks/bridge/declarative_frontend/engine/js_types.h index e95eb086..5103738b 100644 --- a/frameworks/bridge/declarative_frontend/engine/js_types.h +++ b/frameworks/bridge/declarative_frontend/engine/js_types.h @@ -87,7 +87,7 @@ inline auto ToJSValue(T&& val) return JsiValueConvertor::toJsiValue(std::forward(val)); }; -Local JsStopPropagation(EcmaVM*, Local, const Local [], int32_t, void*); +Local JsStopPropagation(panda::JsiRuntimeCallInfo *info); #endif diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.h b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.h index 0e70981e..e83f65cd 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.h @@ -24,11 +24,11 @@ namespace __detail__ { template -std::tuple ToTuple(const panda::Local argv[]) +std::tuple ToTuple(panda::JsiRuntimeCallInfo *runtimeCallInfo) { int index = 0; return { - OHOS::Ace::Framework::JsiValueConvertor::fromJsiValue(argv[index++])..., + OHOS::Ace::Framework::JsiValueConvertor::fromJsiValue(runtimeCallInfo->GetCallArgRef(index++))..., }; } @@ -93,52 +93,32 @@ public: private: template - static panda::Local InternalMemberFunctionCallback(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, - void* data); + static panda::Local InternalMemberFunctionCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo); template - static panda::Local InternalJSMemberFunctionCallback(panda::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, - void* data); + static panda::Local InternalJSMemberFunctionCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo); template - static panda::Local MethodCallback(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, - void* data); + static panda::Local MethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo); template - static panda::Local JSMethodCallback(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, - void* data); + static panda::Local JSMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo); template - static panda::Local StaticMethodCallback(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, - void* data); + static panda::Local StaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo); - static panda::Local JSStaticMethodCallback(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, - void* data); + static panda::Local JSStaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo); template - static panda::Local InternalConstructor(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, panda::Local newTarget, - const panda::Local argv[], int32_t argc, void* data); + static panda::Local InternalConstructor(panda::JsiRuntimeCallInfo *runtimeCallInfo); - static panda::Local ConstructorInterceptor(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, panda::Local newTarget, - const panda::Local argv[], int32_t argc, void* data); + static panda::Local ConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo); static void DestructorInterceptor(void* nativePtr, void* data); - static panda::Local JSConstructorInterceptor(panda::ecmascript::EcmaVM* vm, - panda::Local thisObj, panda::Local newTarget, - const panda::Local argv[], int32_t argc, void* data); + static panda::Local JSConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo); - static bool CheckIfConstructCall(panda::ecmascript::EcmaVM* vm, panda::Local thisObj, - panda::Local newTarget, const panda::Local argv[], int32_t argc, - void* data); + static bool CheckIfConstructCall(panda::JsiRuntimeCallInfo *runtimeCallInfo); static thread_local std::unordered_map> staticFunctions_; static thread_local std::unordered_map> customFunctions_; diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.inl b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.inl index 41e6bc19..ca75efca 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.inl +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_bindings.inl @@ -74,7 +74,7 @@ void JsiClass::Method(const char* name, R (Base::*func)(Args...), int id) functionIds_.emplace_back(funcId); customFunctions_.emplace( name, panda::Global(vm, - panda::FunctionRef::New(vm, MethodCallback, funcId.get()))); + panda::FunctionRef::New(vm, MethodCallback, nullptr, funcId.get()))); } template @@ -87,9 +87,7 @@ void JsiClass::CustomMethod(const char* name, MemberFunctionCallback callb functionIds_.emplace_back(funcId); customFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - InternalMemberFunctionCallback, - const panda::Local[], int32_t, void*>, - funcId.get()))); + InternalMemberFunctionCallback, nullptr, funcId.get()))); } template @@ -98,7 +96,7 @@ void JsiClass::CustomMethod(const char* name, FunctionCallback callback) auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); auto vm = const_cast(runtime->GetEcmaVm()); customFunctions_.emplace( - name, panda::Global(vm, panda::FunctionRef::New(vm, callback, nullptr))); + name, panda::Global(vm, panda::FunctionRef::New(vm, callback))); } template @@ -111,7 +109,7 @@ void JsiClass::CustomMethod(const char* name, JSMemberFunctionCallback cal functionIds_.emplace_back(funcId); customFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - InternalJSMemberFunctionCallback, funcId.get()))); + InternalJSMemberFunctionCallback, nullptr, funcId.get()))); } template @@ -125,17 +123,13 @@ void JsiClass::CustomProperty(const char* name, MemberFunctionGetCallback customGetFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - InternalMemberFunctionCallback, - const panda::Local[], int32_t, void*>, - funcGetId.get()))); + InternalMemberFunctionCallback, nullptr, funcGetId.get()))); auto funcSetId = std::make_shared(setterId); functionIds_.emplace_back(funcSetId); customSetFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - InternalMemberFunctionCallback, - const panda::Local[], int32_t, void*>, - funcSetId.get()))); + InternalMemberFunctionCallback, nullptr, funcSetId.get()))); } template @@ -144,9 +138,9 @@ void JsiClass::CustomProperty(const char* name, FunctionGetCallback getter, F auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); auto vm = const_cast(runtime->GetEcmaVm()); customGetFunctions_.emplace( - name, panda::Global(vm, panda::FunctionRef::New(vm, getter, nullptr))); + name, panda::Global(vm, panda::FunctionRef::New(vm, getter))); customSetFunctions_.emplace( - name, panda::Global(vm, panda::FunctionRef::New(vm, setter, nullptr))); + name, panda::Global(vm, panda::FunctionRef::New(vm, setter))); } template @@ -159,12 +153,12 @@ void JsiClass::CustomProperty(const char* name, JSMemberFunctionCallback c functionIds_.emplace_back(funcGetId); customGetFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - InternalJSMemberFunctionCallback, funcGetId.get()))); + InternalJSMemberFunctionCallback, nullptr, funcGetId.get()))); auto funcSetId = std::make_shared(setterId); functionIds_.emplace_back(funcSetId); customSetFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - InternalJSMemberFunctionCallback, funcSetId.get()))); + InternalJSMemberFunctionCallback, nullptr, funcSetId.get()))); } template @@ -177,7 +171,7 @@ void JsiClass::StaticMethod(const char* name, R (*func)(Args...), int id) functionIds_.emplace_back(funcId); staticFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - StaticMethodCallback, funcId.get()))); + StaticMethodCallback, nullptr, funcId.get()))); } template @@ -189,7 +183,7 @@ void JsiClass::StaticMethod(const char* name, JSFunctionCallback func, int id functionIds_.emplace_back(funcId); staticFunctions_.emplace( name, panda::Global(vm, panda::FunctionRef::New(vm, - JSStaticMethodCallback, funcId.get()))); + JSStaticMethodCallback, nullptr, funcId.get()))); } template @@ -198,7 +192,7 @@ void JsiClass::CustomStaticMethod(const char* name, FunctionCallback callback auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); auto vm = const_cast(runtime->GetEcmaVm()); staticFunctions_.emplace( - name, panda::Global(vm, panda::FunctionRef::New(vm, callback, nullptr))); + name, panda::Global(vm, panda::FunctionRef::New(vm, callback))); } template @@ -240,7 +234,8 @@ void JsiClass::Bind(BindingTarget t, FunctionCallback ctor) } } - t->Set(vm, panda::StringRef::NewFromUtf8(vm, ThisJSClass::JSName()), panda::Local(classFunction_.ToLocal(vm))); + t->Set(vm, panda::StringRef::NewFromUtf8(vm, ThisJSClass::JSName()), + panda::Local(classFunction_.ToLocal(vm))); } template @@ -348,34 +343,36 @@ std::unordered_map>& JsiClass: template template -panda::Local JsiClass::InternalMemberFunctionCallback(panda::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::InternalMemberFunctionCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + panda::Local thisObj = runtimeCallInfo->GetThisRef(); C* ptr = static_cast(panda::Local(thisObj)->GetNativePointerField(0)); T* instance = static_cast(ptr); - int index = *(static_cast(data)); + int index = *(static_cast(runtimeCallInfo->GetData())); auto binding = ThisJSClass::GetFunctionBinding(index); LOGD("InternalMemberFunctionCallback: Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name()); auto fnPtr = static_cast, Args...>*>(binding)->Get(); - (instance->*fnPtr)(vm, thisObj, argv, argc, data); + (instance->*fnPtr)(runtimeCallInfo); } template template -panda::Local JsiClass::InternalJSMemberFunctionCallback(panda::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::InternalJSMemberFunctionCallback( + panda::JsiRuntimeCallInfo *runtimeCallInfo) { + panda::Local thisObj = runtimeCallInfo->GetThisRef(); C* ptr = static_cast(panda::Local(thisObj)->GetNativePointerField(0)); T* instance = static_cast(ptr); - int index = *(static_cast(data)); + int index = *(static_cast(runtimeCallInfo->GetData())); auto binding = ThisJSClass::GetFunctionBinding(index); LOGD("InternalmemberFunctionCallback: Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name()); auto fnPtr = static_cast*>(binding)->Get(); - JsiCallbackInfo info(vm, thisObj, argc, argv); + JsiCallbackInfo info(runtimeCallInfo); (instance->*fnPtr)(info); std::variant> retVal = info.GetReturnValue(); + EcmaVM* vm = runtimeCallInfo->GetVM(); auto jsVal = std::get_if>(&retVal); if (jsVal) { return jsVal->ToLocal(vm); @@ -385,21 +382,22 @@ panda::Local JsiClass::InternalJSMemberFunctionCallback(pa template template -panda::Local JsiClass::MethodCallback(EcmaVM* vm, panda::Local thisObj, - const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::MethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + panda::Local thisObj = runtimeCallInfo->GetThisRef(); C* ptr = static_cast(panda::Local(thisObj)->GetNativePointerField(0)); Class* instance = static_cast(ptr); - int index = *(static_cast(data)); + int index = *(static_cast(runtimeCallInfo->GetData())); auto binding = ThisJSClass::GetFunctionBinding(index); LOGD("Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name()); auto fnPtr = static_cast*>(binding)->Get(); - auto tuple = __detail__::ToTuple...>(argv); + auto tuple = __detail__::ToTuple...>(runtimeCallInfo); bool returnSelf = binding->Options() & MethodOptions::RETURN_SELF; constexpr bool isVoid = std::is_void_v; constexpr bool hasArguments = sizeof...(Args) != 0; + EcmaVM* vm = runtimeCallInfo->GetVM(); if constexpr (isVoid && hasArguments) { // C::MemberFunction(Args...) FunctionUtils::CallMemberFunction(instance, fnPtr, tuple); @@ -421,35 +419,35 @@ panda::Local JsiClass::MethodCallback(EcmaVM* vm, panda::L template template -panda::Local JsiClass::JSMethodCallback(panda::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::JSMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + panda::Local thisObj = runtimeCallInfo->GetThisRef(); C* ptr = static_cast(panda::Local(thisObj)->GetNativePointerField(0)); Class* instance = static_cast(ptr); - int index = *(static_cast(data)); + int index = *(static_cast(runtimeCallInfo->GetData())); auto binding = ThisJSClass::GetFunctionBinding(index); LOGD("Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name()); - - JsiCallbackInfo info(vm, thisObj, argc, argv); + JsiCallbackInfo info(runtimeCallInfo); auto fnPtr = static_cast*>(binding)->Get(); (instance->*fnPtr)(info); } template template -panda::Local JsiClass::StaticMethodCallback(panda::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::StaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo) { - int index = *(static_cast(data)); + int index = *(static_cast(runtimeCallInfo->GetData())); auto binding = ThisJSClass::GetFunctionBinding(index); LOGD("Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name()); auto fnPtr = static_cast*>(binding)->Get(); - auto tuple = __detail__::ToTuple...>(argv); + auto tuple = __detail__::ToTuple...>(runtimeCallInfo); bool returnSelf = binding->Options() & MethodOptions::RETURN_SELF; constexpr bool isVoid = std::is_void_v; constexpr bool hasArguments = sizeof...(Args) != 0; + panda::Local thisObj = runtimeCallInfo->GetThisRef(); + EcmaVM* vm = runtimeCallInfo->GetVM(); if constexpr (isVoid && hasArguments) { // void C::MemberFunction(Args...) FunctionUtils::CallStaticMemberFunction(fnPtr, tuple); @@ -470,15 +468,15 @@ panda::Local JsiClass::StaticMethodCallback(panda::EcmaVM* } template -panda::Local JsiClass::JSStaticMethodCallback(panda::EcmaVM* vm, - panda::Local thisObj, const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::JSStaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo) { - int index = *(static_cast(data)); + int index = *(static_cast(runtimeCallInfo->GetData())); auto binding = ThisJSClass::GetFunctionBinding(index); LOGD("Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name()); auto fnPtr = static_cast*>(binding)->Get(); - JsiCallbackInfo info(vm, thisObj, argc, argv); + JsiCallbackInfo info(runtimeCallInfo); fnPtr(info); + EcmaVM* vm = runtimeCallInfo->GetVM(); std::variant> retVal = info.GetReturnValue(); auto jsVal = std::get_if>(&retVal); if (jsVal) { @@ -489,16 +487,15 @@ panda::Local JsiClass::JSStaticMethodCallback(panda::EcmaV template template -panda::Local JsiClass::InternalConstructor(panda::EcmaVM* vm, - panda::Local thisObj, panda::Local newTarget, - const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::InternalConstructor(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + panda::Local newTarget = runtimeCallInfo->GetNewTargetRef(); if (!newTarget->IsFunction()) { - return panda::Local(panda::JSValueRef::Undefined(vm)); + return panda::Local(panda::JSValueRef::Undefined(runtimeCallInfo->GetVM())); } - JsiCallbackInfo info(vm, thisObj, argc, argv); - auto tuple = __detail__::ToTuple...>(argv); + panda::Local thisObj = runtimeCallInfo->GetThisRef(); + auto tuple = __detail__::ToTuple...>(runtimeCallInfo); C* instance = FunctionUtils::ConstructFromTuple(tuple); Local(thisObj)->SetNativePointerFieldCount(1); panda::Local(thisObj)->SetNativePointerField(0, static_cast(instance)); @@ -506,31 +503,29 @@ panda::Local JsiClass::InternalConstructor(panda::EcmaVM* } template -bool JsiClass::CheckIfConstructCall(panda::EcmaVM* vm, panda::Local thisObj, - panda::Local newTarget, const panda::Local argv[], int32_t argc, void* data) +bool JsiClass::CheckIfConstructCall(panda::JsiRuntimeCallInfo *runtimeCallInfo) { return true; } template -panda::Local JsiClass::ConstructorInterceptor(panda::EcmaVM* vm, - panda::Local thisObj, panda::Local newTarget, - const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::ConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + panda::Local newTarget = runtimeCallInfo->GetNewTargetRef(); + EcmaVM* vm = runtimeCallInfo->GetVM(); if (!newTarget->IsFunction()) { return panda::Local(panda::JSValueRef::Undefined(vm)); } - - return constructor_(vm, thisObj, argv, argc, data); + return constructor_(runtimeCallInfo); } template -panda::Local JsiClass::JSConstructorInterceptor(panda::EcmaVM* vm, - panda::Local thisObj, panda::Local newTarget, - const panda::Local argv[], int32_t argc, void* data) +panda::Local JsiClass::JSConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + panda::Local newTarget = runtimeCallInfo->GetNewTargetRef(); if (newTarget->IsFunction()) { - JsiCallbackInfo info(vm, thisObj, argc, argv); + JsiCallbackInfo info(runtimeCallInfo); jsConstructor_(info); auto retVal = info.GetReturnValue(); if (retVal.valueless_by_exception()) { @@ -539,6 +534,7 @@ panda::Local JsiClass::JSConstructorInterceptor(panda::Ecm } auto instance = std::get_if(&retVal); if (instance) { + panda::Local thisObj = runtimeCallInfo->GetThisRef(); Local(thisObj)->SetNativePointerFieldCount(1); Local(thisObj)->SetNativePointerField(0, *instance, &JsiClass::DestructorInterceptor); LOGD("Constructed %{public}s", ThisJSClass::JSName()); diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp index f9792197..2e9c3037 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp @@ -244,7 +244,7 @@ JsiRef JsiFunction::Call(JsiRef thisVal, int argc, JsiRef JsiFunction::New(JsiFunctionCallback func) { auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); - return panda::FunctionRef::New(const_cast(runtime->GetEcmaVm()), func, nullptr); + return panda::FunctionRef::New(const_cast(runtime->GetEcmaVm()), func); } // ----------------------- @@ -274,33 +274,20 @@ panda::Local JsiObjTemplate::New() // ----------------------- // Implementation of JsiCallBackInfo // ----------------------- -JsiCallbackInfo::JsiCallbackInfo(panda::ecmascript::EcmaVM* vm, panda::Local thisObj, int32_t argc, - const panda::Local* argv) - : vm_(vm), thisObj_(vm, thisObj), argc_(argc) -{ - for (int i = 0; i < argc; i++) { - argv_.emplace_back(vm, argv[i]); - } - -} +JsiCallbackInfo::JsiCallbackInfo(panda::JsiRuntimeCallInfo* info) : info_(info) {} JsiCallbackInfo::~JsiCallbackInfo() { - thisObj_.FreeGlobalHandleAddr(); auto jsVal = std::get_if>(&retVal_); if (jsVal) { jsVal->FreeGlobalHandleAddr(); } - for (int i = 0; i < argc_; i++) { - argv_[i].FreeGlobalHandleAddr(); - } - argv_.clear(); } JsiRef JsiCallbackInfo::operator[](size_t index) const { - if (static_cast(index) < argc_) { - return JsiRef::Make(argv_[index].ToLocal(vm_)); + if (static_cast(index) < Length()) { + return JsiRef::Make(info_->GetCallArgRef(index)); } auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); return JsiRef::Make(panda::JSValueRef::Undefined(runtime->GetEcmaVm())); @@ -308,19 +295,20 @@ JsiRef JsiCallbackInfo::operator[](size_t index) const JsiRef JsiCallbackInfo::This() const { - auto obj = JsiObject { thisObj_.ToLocal(vm_) }; + auto obj = JsiObject { info_->GetThisRef() }; auto ref = JsiRef(obj); return ref; } int JsiCallbackInfo::Length() const { - return argc_; + return info_->GetArgsNumber(); } void JsiCallbackInfo::ReturnSelf() const { - retVal_ = thisObj_; + panda::Global thisObj(info_->GetVM(), info_->GetThisRef()); + retVal_ = thisObj; } } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h index a67bb090..0c5467e8 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h @@ -30,8 +30,7 @@ namespace OHOS::Ace::Framework { -using JsiFunctionCallback = panda::Local (*)(panda::ecmascript::EcmaVM*, - panda::Local, const panda::Local[], int32_t, void*); +using JsiFunctionCallback = panda::Local (*)(panda::JsiRuntimeCallInfo*); template class JsiType { @@ -174,8 +173,7 @@ struct JsiExecutionContext { class JsiCallbackInfo { public: - JsiCallbackInfo(panda::ecmascript::EcmaVM* vm, panda::Local thisObj, int32_t argc, - const panda::Local* argv); + JsiCallbackInfo(panda::JsiRuntimeCallInfo* info); ~JsiCallbackInfo(); JsiCallbackInfo(const JsiCallbackInfo&) = delete; JsiCallbackInfo& operator=(const JsiCallbackInfo&) = delete; @@ -199,14 +197,11 @@ public: JsiExecutionContext GetExecutionContext() const { - return JsiExecutionContext { vm_ }; + return JsiExecutionContext { info_->GetVM() }; } private: - panda::ecmascript::EcmaVM* vm_ = nullptr; - panda::Global thisObj_; - int argc_; - std::vector> argv_; + panda::JsiRuntimeCallInfo* info_ = nullptr; mutable std::variant> retVal_; }; diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.inl b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.inl index 3a4c3c64..5772d51f 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.inl +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.inl @@ -174,7 +174,7 @@ void JsiCallbackInfo::SetReturnValue(T* instance) const template void JsiCallbackInfo::SetReturnValue(JsiRef val) const { - retVal_ = panda::Global(vm_, val.Get().GetHandle()); + retVal_ = panda::Global(info_->GetVM(), val.Get().GetHandle()); } template diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp index cd05e9dc..fc7619e8 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp @@ -153,20 +153,22 @@ namespace OHOS::Ace::Framework { -panda::Local JsLoadDocument(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsLoadDocument(panda::JsiRuntimeCallInfo *runtimeCallInfo) { LOGI("Load Document start"); + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsObject()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsObject()) { LOGE("The arg is wrong, value must be object"); return panda::JSValueRef::Undefined(vm); } - panda::Local obj = args[0]->ToObject(vm); + panda::Local obj = firstArg->ToObject(vm); JSView* view = static_cast(obj->GetNativePointerField(0)); auto runtime = JsiDeclarativeEngineInstance::GetCurrentRuntime(); @@ -201,17 +203,18 @@ panda::Local JsLoadDocument(panda::EcmaVM* vm, panda::Local

JsDumpMemoryStats(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsDumpMemoryStats(panda::JsiRuntimeCallInfo *runtimeCallInfo) { LOGD("dumpMemoryStats: Not Implemented for ARK. UnSupported"); + EcmaVM* vm = runtimeCallInfo->GetVM(); return panda::JSValueRef::Undefined(vm); } -panda::Local JsGetI18nResource(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsGetI18nResource(panda::JsiRuntimeCallInfo *runtimeCallInfo) { LOGD("JsGetI18nResource"); + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); @@ -220,13 +223,14 @@ panda::Local JsGetI18nResource(panda::EcmaVM* vm, panda::Loca LOGE("The arg is wrong, it is supposed to have one or two arguments"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsString()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsString()) { LOGE("The arg is wrong, value must be string"); return panda::JSValueRef::Undefined(vm); } std::vector splitStr; - std::string str = args[0]->ToString(vm)->ToString(); + std::string str = firstArg->ToString(vm)->ToString(); StringUtils::SplitStr(str, ".", splitStr); if (splitStr.size() != 2) { LOGE("input string res value must can be split by dot"); @@ -239,8 +243,9 @@ panda::Local JsGetI18nResource(panda::EcmaVM* vm, panda::Loca auto resultStr = resultStrJson->GetString(); if (argc == 2) { panda::LocalScope scope(vm); - if (args[1]->IsArray(vm)) { - auto arrayVal = panda::Local(args[1]); + Local secondArg = runtimeCallInfo->GetCallArgRef(1); + if (secondArg->IsArray(vm)) { + auto arrayVal = panda::Local(secondArg); auto len = arrayVal->Length(vm); std::vector arrayResult; for (int32_t i = 0; i < len; i++) { @@ -253,15 +258,15 @@ panda::Local JsGetI18nResource(panda::EcmaVM* vm, panda::Loca arrayResult.emplace_back(itemVal->ToString()); } ReplacePlaceHolderArray(resultStr, arrayResult); - } else if (args[1]->IsObject()) { - auto value = panda::JSON::Stringify(vm, args[1]); + } else if (secondArg->IsObject()) { + auto value = panda::JSON::Stringify(vm, secondArg); if (value->IsString()) { auto valueStr = panda::Local(value); std::unique_ptr argsPtr = JsonUtil::ParseJsonString(valueStr->ToString()); ReplacePlaceHolder(resultStr, argsPtr); } - } else if (args[1]->IsNumber()) { - double count = args[1]->ToNumber(vm)->Value(); + } else if (secondArg->IsNumber()) { + double count = secondArg->ToNumber(vm)->Value(); auto pluralChoice = Localization::GetInstance()->PluralRulesFormat(count); if (!pluralChoice.empty()) { resultStr = ParserPluralResource(resultStrJson, pluralChoice, str); @@ -272,20 +277,22 @@ panda::Local JsGetI18nResource(panda::EcmaVM* vm, panda::Loca return panda::StringRef::NewFromUtf8(vm, resultStr.c_str()); } -panda::Local JsGetMediaResource(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsGetMediaResource(panda::JsiRuntimeCallInfo *runtimeCallInfo) { LOGD("JsGetMediaResource"); + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsString()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsString()) { LOGE("The arg is wrong, value must be string"); return panda::JSValueRef::Undefined(vm); } - std::string targetMediaFileName = args[0]->ToString(vm)->ToString(); + std::string targetMediaFileName = firstArg->ToString(vm)->ToString(); std::string filePath = JsiDeclarativeEngineInstance::GetMediaResource(targetMediaFileName); return panda::StringRef::NewFromUtf8(vm, filePath.c_str()); } @@ -306,9 +313,9 @@ RefPtr JsGetFrontendDelegate() return engineInstance->GetDelegate(); } -panda::Local JsGetInspectorNodes(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsGetInspectorNodes(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); @@ -323,14 +330,16 @@ panda::Local JsGetInspectorNodes(panda::EcmaVM* vm, panda::Lo return panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, nodeInfos->ToString().c_str())); } -panda::Local JsGetInspectorNodeById(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsGetInspectorNodeById(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); } - if (argc < 1 || !args[0]->IsNumber()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (argc < 1 || !firstArg->IsNumber()) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } @@ -344,14 +353,14 @@ panda::Local JsGetInspectorNodeById(panda::EcmaVM* vm, panda: LOGE("accessibilityManager is null!"); return panda::JSValueRef::Undefined(vm); } - int32_t intValue = args[0]->Int32Value(vm); + int32_t intValue = firstArg->Int32Value(vm); auto nodeInfo = accessibilityManager->DumpComposedElementToJson(intValue); return panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, nodeInfo->ToString().c_str())); } -panda::Local JsGetInspectorTree(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsGetInspectorTree(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); @@ -370,14 +379,16 @@ panda::Local JsGetInspectorTree(panda::EcmaVM* vm, panda::Loc return panda::StringRef::NewFromUtf8(vm, nodeInfos.c_str()); } -panda::Local JsGetInspectorByKey(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsGetInspectorByKey(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); } - if (argc < 1 || !args[0]->IsString()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (argc < 1 || !firstArg->IsString()) { LOGE("The arg is wrong, must have one string argument"); return panda::JSValueRef::Undefined(vm); } @@ -392,19 +403,21 @@ panda::Local JsGetInspectorByKey(panda::EcmaVM* vm, panda::Lo return panda::JSValueRef::Undefined(vm); } - std::string key = args[0]->ToString(vm)->ToString(); + std::string key = firstArg->ToString(vm)->ToString(); auto resultStr = V2::Inspector::GetInspectorNodeByKey(pipelineContext, key); return panda::StringRef::NewFromUtf8(vm, resultStr.c_str()); } -panda::Local JsSendEventByKey(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsSendEventByKey(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); } - if (argc < 3 || !args[0]->IsString()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (argc < 3 || !firstArg->IsString()) { // 3: arg numbers LOGE("The arg is wrong, must have one string argument"); return panda::JSValueRef::Undefined(vm); } @@ -419,9 +432,9 @@ panda::Local JsSendEventByKey(panda::EcmaVM* vm, panda::Local return panda::JSValueRef::Undefined(vm); } - std::string key = args[0]->ToString(vm)->ToString(); - auto action = args[1]->Int32Value(vm); - auto params = args[2]->ToString(vm)->ToString(); + std::string key = firstArg->ToString(vm)->ToString(); + auto action = runtimeCallInfo->GetCallArgRef(1)->Int32Value(vm); + auto params = runtimeCallInfo->GetCallArgRef(2)->ToString(vm)->ToString(); auto result = V2::Inspector::SendEventByKey(pipelineContext, key, action, params); return panda::BooleanRef::New(vm, result); } @@ -447,14 +460,16 @@ static TouchEvent GetTouchPointFromJS(const JsiObject& value) return touchPoint; } -panda::Local JsSendTouchEvent(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsSendTouchEvent(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); } - if (argc < 1 || !args[0]->IsObject()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (argc < 1 || !firstArg->IsObject()) { LOGE("The arg is wrong, must have one object argument"); return panda::JSValueRef::Undefined(vm); } @@ -469,7 +484,7 @@ panda::Local JsSendTouchEvent(panda::EcmaVM* vm, panda::Local LOGE("pipelineContext==nullptr"); return panda::JSValueRef::Undefined(vm); } - JsiObject obj(args[0]); + JsiObject obj(firstArg); TouchEvent touchPoint = GetTouchPointFromJS(obj); auto result = pipelineContext->GetTaskExecutor()->PostTask( [pipelineContext, touchPoint]() { pipelineContext->OnTouchEvent(touchPoint); }, TaskExecutor::TaskType::UI); @@ -500,14 +515,16 @@ static V2::JsKeyEvent GetKeyEventFromJS(const JsiObject& value) return keyEvent; } -panda::Local JsSendKeyEvent(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsSendKeyEvent(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); } - if (argc < 1 || !args[0]->IsObject()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (argc < 1 || !firstArg->IsObject()) { LOGE("The arg is wrong, must have one object argument"); return panda::JSValueRef::Undefined(vm); } @@ -522,7 +539,7 @@ panda::Local JsSendKeyEvent(panda::EcmaVM* vm, panda::Local

JsSendMouseEvent(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local JsSendMouseEvent(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (vm == nullptr) { LOGE("The EcmaVM is null"); return panda::JSValueRef::Undefined(vm); } - if (argc < 1 || !args[0]->IsObject()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (argc < 1 || !firstArg->IsObject()) { LOGE("The arg is wrong, must have one object argument"); return panda::JSValueRef::Undefined(vm); } @@ -572,39 +591,43 @@ panda::Local JsSendMouseEvent(panda::EcmaVM* vm, panda::Local LOGE("pipelineContext==nullptr"); return panda::JSValueRef::Undefined(vm); } - JsiObject obj(args[0]); + JsiObject obj(firstArg); MouseEvent mouseEvent = GetMouseEventFromJS(obj); auto result = pipelineContext->GetTaskExecutor()->PostTask( [pipelineContext, mouseEvent]() { pipelineContext->OnMouseEvent(mouseEvent); }, TaskExecutor::TaskType::UI); return panda::BooleanRef::New(vm, result); } -panda::Local Vp2Px(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local Vp2Px(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsNumber()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsNumber()) { LOGE("The arg is wrong, value must be number"); return panda::JSValueRef::Undefined(vm); } - double vpValue = args[0]->ToNumber(vm)->Value(); + double vpValue = firstArg->ToNumber(vm)->Value(); double density = SystemProperties::GetResolution(); double pxValue = vpValue * density; return panda::NumberRef::New(vm, pxValue); } -panda::Local Px2Vp(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local Px2Vp(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsNumber()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsNumber()) { LOGE("The arg is wrong, value must be number"); return panda::JSValueRef::Undefined(vm); } @@ -614,26 +637,28 @@ panda::Local Px2Vp(panda::EcmaVM* vm, panda::LocalToNumber(vm)->Value(); + double pxValue = firstArg->ToNumber(vm)->Value(); double vpValue = pxValue / density; return panda::NumberRef::New(vm, vpValue); } -panda::Local Fp2Px(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local Fp2Px(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsNumber()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsNumber()) { LOGE("The arg is wrong, value must be number"); return panda::JSValueRef::Undefined(vm); } double density = SystemProperties::GetResolution(); - double fpValue = args[0]->ToNumber(vm)->Value(); + double fpValue = firstArg->ToNumber(vm)->Value(); auto container = Container::Current(); if (!container) { @@ -649,14 +674,16 @@ panda::Local Fp2Px(panda::EcmaVM* vm, panda::Local Px2Fp(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local Px2Fp(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsNumber()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsNumber()) { LOGE("The arg is wrong, value must be number"); return panda::JSValueRef::Undefined(vm); } @@ -666,7 +693,7 @@ panda::Local Px2Fp(panda::EcmaVM* vm, panda::LocalToNumber(vm)->Value(); + double pxValue = firstArg->ToNumber(vm)->Value(); auto container = Container::Current(); if (!container) { LOGW("container is null"); @@ -682,14 +709,16 @@ panda::Local Px2Fp(panda::EcmaVM* vm, panda::Local Lpx2Px(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local Lpx2Px(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsNumber()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsNumber()) { LOGE("The arg is wrong, value must be number"); return panda::JSValueRef::Undefined(vm); } @@ -702,19 +731,21 @@ panda::Local Lpx2Px(panda::EcmaVM* vm, panda::LocalGetPipelineContext(); auto frontend = pipelineContext->GetFrontend(); auto windowConfig = frontend->GetWindowConfig(); - double lpxValue = args[0]->ToNumber(vm)->Value(); + double lpxValue = firstArg->ToNumber(vm)->Value(); double pxValue = lpxValue * windowConfig.designWidthScale; return panda::NumberRef::New(vm, pxValue); } -panda::Local Px2Lpx(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local Px2Lpx(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Undefined(vm); } - if (!args[0]->IsNumber()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsNumber()) { LOGE("The arg is wrong, value must be number"); return panda::JSValueRef::Undefined(vm); } @@ -727,24 +758,26 @@ panda::Local Px2Lpx(panda::EcmaVM* vm, panda::LocalGetPipelineContext(); auto frontend = pipelineContext->GetFrontend(); auto windowConfig = frontend->GetWindowConfig(); - double pxValue = args[0]->ToNumber(vm)->Value(); + double pxValue = firstArg->ToNumber(vm)->Value(); double lpxValue = pxValue / windowConfig.designWidthScale; return panda::NumberRef::New(vm, lpxValue); } -panda::Local SetAppBackgroundColor(panda::EcmaVM* vm, panda::Local value, - const panda::Local args[], int32_t argc, void* data) +panda::Local SetAppBackgroundColor(panda::JsiRuntimeCallInfo *runtimeCallInfo) { + EcmaVM* vm = runtimeCallInfo->GetVM(); + size_t argc = runtimeCallInfo->GetArgsNumber(); if (argc != 1) { LOGE("The arg is wrong, must have one argument"); return panda::JSValueRef::Exception(vm); } - if (!args[0]->IsString()) { + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + if (!firstArg->IsString()) { LOGE("The arg is wrong, value must be number"); return panda::JSValueRef::Exception(vm); } - std::string backgroundColorStr = args[0]->ToString(vm)->ToString(); + std::string backgroundColorStr = firstArg->ToString(vm)->ToString(); auto container = Container::Current(); if (!container) { LOGW("container is null"); @@ -994,43 +1027,43 @@ void JsRegisterViews(BindingTarget globalObj) } auto vm = runtime->GetEcmaVm(); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "loadDocument"), - panda::FunctionRef::New(const_cast(vm), JsLoadDocument, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsLoadDocument)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "dumpMemoryStats"), - panda::FunctionRef::New(const_cast(vm), JsDumpMemoryStats, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsDumpMemoryStats)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$s"), - panda::FunctionRef::New(const_cast(vm), JsGetI18nResource, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsGetI18nResource)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$m"), - panda::FunctionRef::New(const_cast(vm), JsGetMediaResource, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsGetMediaResource)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodes"), - panda::FunctionRef::New(const_cast(vm), JsGetInspectorNodes, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsGetInspectorNodes)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodeById"), - panda::FunctionRef::New(const_cast(vm), JsGetInspectorNodeById, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsGetInspectorNodeById)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorTree"), - panda::FunctionRef::New(const_cast(vm), JsGetInspectorTree, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsGetInspectorTree)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorByKey"), - panda::FunctionRef::New(const_cast(vm), JsGetInspectorByKey, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsGetInspectorByKey)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendEventByKey"), - panda::FunctionRef::New(const_cast(vm), JsSendEventByKey, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsSendEventByKey)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendTouchEvent"), - panda::FunctionRef::New(const_cast(vm), JsSendTouchEvent, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsSendTouchEvent)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendKeyEvent"), - panda::FunctionRef::New(const_cast(vm), JsSendKeyEvent, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsSendKeyEvent)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendMouseEvent"), - panda::FunctionRef::New(const_cast(vm), JsSendMouseEvent, nullptr)); + panda::FunctionRef::New(const_cast(vm), JsSendMouseEvent)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "vp2px"), - panda::FunctionRef::New(const_cast(vm), Vp2Px, nullptr)); + panda::FunctionRef::New(const_cast(vm), Vp2Px)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2vp"), - panda::FunctionRef::New(const_cast(vm), Px2Vp, nullptr)); + panda::FunctionRef::New(const_cast(vm), Px2Vp)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "fp2px"), - panda::FunctionRef::New(const_cast(vm), Fp2Px, nullptr)); + panda::FunctionRef::New(const_cast(vm), Fp2Px)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2fp"), - panda::FunctionRef::New(const_cast(vm), Px2Fp, nullptr)); + panda::FunctionRef::New(const_cast(vm), Px2Fp)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "lpx2px"), - panda::FunctionRef::New(const_cast(vm), Lpx2Px, nullptr)); + panda::FunctionRef::New(const_cast(vm), Lpx2Px)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2lpx"), - panda::FunctionRef::New(const_cast(vm), Px2Lpx, nullptr)); + panda::FunctionRef::New(const_cast(vm), Px2Lpx)); globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "setAppBgColor"), - panda::FunctionRef::New(const_cast(vm), SetAppBackgroundColor, nullptr)); + panda::FunctionRef::New(const_cast(vm), SetAppBackgroundColor)); JSViewAbstract::JSBind(); JSContainerBase::JSBind(); diff --git a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp index 511214ff..6b16eb8e 100644 --- a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp +++ b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp @@ -24,15 +24,13 @@ namespace OHOS::Ace::Framework { // NOLINTNEXTLINE(readability-identifier-naming) static constexpr auto PANDA_MAIN_FUNCTION = "_GLOBAL::func_main_0"; -Local FunctionCallback(EcmaVM *vm, Local thisValue, - const Local argument[], // NOLINT(modernize-avoid-c-arrays) - int32_t length, void *data) +Local FunctionCallback(panda::JsiRuntimeCallInfo *info) { - auto package = reinterpret_cast(data); + auto package = reinterpret_cast(info->GetData()); if (package == nullptr) { - return JSValueRef::Undefined(vm); + return JSValueRef::Undefined(info->GetVM()); } - return package->Callback(thisValue, argument, length); + return package->Callback(info); } bool ArkJSRuntime::Initialize(const std::string &libraryPath, bool isDebugMode) @@ -189,7 +187,7 @@ shared_ptr ArkJSRuntime::NewFunction(RegisterFunctionType func) LocalScope scope(vm_); auto data = new PandaFunctionData(shared_from_this(), func); dataList_.emplace_back(data); - return std::make_shared(shared_from_this(), FunctionRef::New(vm_, FunctionCallback, data)); + return std::make_shared(shared_from_this(), FunctionRef::New(vm_, FunctionCallback, nullptr, data)); } shared_ptr ArkJSRuntime::NewNativePointer(void *ptr) @@ -220,18 +218,18 @@ void ArkJSRuntime::ExecutePendingJob() JSNApi::ExecutePendingJob(vm_); } -Local PandaFunctionData::Callback(const Local &thisValue, - const Local argument[], // NOLINT(modernize-avoid-c-arrays) - int32_t length) const +Local PandaFunctionData::Callback(panda::JsiRuntimeCallInfo *info) const { EscapeLocalScope scope(runtime_->GetEcmaVm()); - shared_ptr thisPtr = std::static_pointer_cast(std::make_shared(runtime_, thisValue)); + shared_ptr thisPtr = + std::static_pointer_cast(std::make_shared(runtime_, info->GetThisRef())); std::vector> argv; + uint32_t length = info->GetArgsNumber(); argv.reserve(length); for (int i = 0; i < length; ++i) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) - argv.emplace_back(std::static_pointer_cast(std::make_shared(runtime_, argument[i]))); + argv.emplace_back( + std::static_pointer_cast(std::make_shared(runtime_, info->GetCallArgRef(i)))); } shared_ptr result = func_(runtime_, thisPtr, argv, length); return scope.Escape(std::static_pointer_cast(result)->GetValue(runtime_)); diff --git a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h index 98a79313..2df813e4 100644 --- a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h +++ b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h @@ -106,14 +106,10 @@ public: NO_MOVE_SEMANTIC(PandaFunctionData); private: - Local Callback(const Local &thisValue, - const Local argument[], // NOLINT(modernize-avoid-c-arrays) - int32_t length) const; + Local Callback(panda::JsiRuntimeCallInfo *info) const; shared_ptr runtime_; RegisterFunctionType func_; - friend Local FunctionCallback(EcmaVM *vm, Local thisValue, - const Local argument[], // NOLINT(modernize-avoid-c-arrays) - int32_t length, void *data); + friend Local FunctionCallback(panda::JsiRuntimeCallInfo *info); }; } // namespace OHOS::Ace::Framework #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ENGINE_JSI_ARK_JS_RUNTIME_H