!890 FFI optimization for ace_engine

Merge pull request !890 from guobingbing/master
This commit is contained in:
openharmony_ci
2022-04-08 01:59:47 +00:00
committed by Gitee
11 changed files with 236 additions and 256 deletions
@@ -83,21 +83,15 @@ constexpr const JavascriptEngine cCurrentJSEngine = JavascriptEngine::V8;
#include "ecmascript/napi/include/jsnapi.h"
using BindingTarget = panda::Local<panda::ObjectRef>;
using FunctionCallback = panda::Local<panda::JSValueRef>(*)(
panda::EcmaVM*, panda::Local<panda::JSValueRef>, const panda::Local<panda::JSValueRef> [], int32_t, void*);
using FunctionGetCallback = panda::Local<panda::JSValueRef>(*)(
panda::EcmaVM*, panda::Local<panda::JSValueRef>, const panda::Local<panda::JSValueRef> [], int32_t, void*);
using FunctionSetCallback = panda::Local<panda::JSValueRef>(*)(
panda::EcmaVM*, panda::Local<panda::JSValueRef>, const panda::Local<panda::JSValueRef> [], int32_t, void*);
using FunctionCallback = panda::Local<panda::JSValueRef>(*)(panda::JsiRuntimeCallInfo*);
using FunctionGetCallback = panda::Local<panda::JSValueRef>(*)(panda::JsiRuntimeCallInfo*);
using FunctionSetCallback = panda::Local<panda::JSValueRef>(*)(panda::JsiRuntimeCallInfo*);
template<typename T>
using MemberFunctionCallback = panda::Local<panda::JSValueRef>(T::*)(
panda::EcmaVM*, panda::Local<panda::JSValueRef>, const panda::Local<panda::JSValueRef> [], int32_t, void*);
using MemberFunctionCallback = panda::Local<panda::JSValueRef>(T::*)(panda::JsiRuntimeCallInfo*);
template<typename T>
using MemberFunctionGetCallback = panda::Local<panda::JSValueRef>(T::*)(
panda::EcmaVM*, panda::Local<panda::JSValueRef>, const panda::Local<panda::JSValueRef> [], int32_t, void*);
using MemberFunctionGetCallback = panda::Local<panda::JSValueRef>(T::*)(panda::JsiRuntimeCallInfo*);
template<typename T>
using MemberFunctionSetCallback = panda::Local<panda::JSValueRef>(T::*)(
panda::EcmaVM*, panda::Local<panda::JSValueRef>, const panda::Local<panda::JSValueRef> [], int32_t, void*);
using MemberFunctionSetCallback = panda::Local<panda::JSValueRef>(T::*)(panda::JsiRuntimeCallInfo*);
using ExoticGetterCallback = int;
using ExoticSetterCallback = int;
using ExoticHasPropertyCallback = int;
@@ -39,15 +39,15 @@ JSValue JsStopPropagation(JSContext* ctx, JSValueConst new_target, int argc, JSV
}
#elif USE_ARK_ENGINE
Local<JSValueRef> JsStopPropagation(
EcmaVM* vm, Local<JSValueRef> thisObj, const Local<JSValueRef> argv[], int32_t argc, void* data)
Local<JSValueRef> JsStopPropagation(panda::JsiRuntimeCallInfo *info)
{
Local<JSValueRef> thisObj = info->GetThisRef();
auto eventInfo = static_cast<BaseEventInfo*>(panda::Local<panda::ObjectRef>(thisObj)->GetNativePointerField(0));
if (eventInfo) {
LOGD("JsStopPropagation is trigger");
eventInfo->SetStopPropagation(true);
}
return JSValueRef::Undefined(vm);
return JSValueRef::Undefined(info->GetVM());
}
#endif
@@ -87,7 +87,7 @@ inline auto ToJSValue(T&& val)
return JsiValueConvertor::toJsiValue(std::forward<T>(val));
};
Local<JSValueRef> JsStopPropagation(EcmaVM*, Local<JSValueRef>, const Local<JSValueRef> [], int32_t, void*);
Local<JSValueRef> JsStopPropagation(panda::JsiRuntimeCallInfo *info);
#endif
@@ -24,11 +24,11 @@
namespace __detail__ {
template<typename... Types>
std::tuple<Types...> ToTuple(const panda::Local<panda::JSValueRef> argv[])
std::tuple<Types...> ToTuple(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
int index = 0;
return {
OHOS::Ace::Framework::JsiValueConvertor::fromJsiValue<Types>(argv[index++])...,
OHOS::Ace::Framework::JsiValueConvertor::fromJsiValue<Types>(runtimeCallInfo->GetCallArgRef(index++))...,
};
}
@@ -93,52 +93,32 @@ public:
private:
template<typename T, typename... Args>
static panda::Local<panda::JSValueRef> InternalMemberFunctionCallback(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc,
void* data);
static panda::Local<panda::JSValueRef> InternalMemberFunctionCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo);
template<typename T>
static panda::Local<panda::JSValueRef> InternalJSMemberFunctionCallback(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc,
void* data);
static panda::Local<panda::JSValueRef> InternalJSMemberFunctionCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo);
template<typename Class, typename R, typename... Args>
static panda::Local<panda::JSValueRef> MethodCallback(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc,
void* data);
static panda::Local<panda::JSValueRef> MethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo);
template<typename Class, typename R, typename... Args>
static panda::Local<panda::JSValueRef> JSMethodCallback(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc,
void* data);
static panda::Local<panda::JSValueRef> JSMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo);
template<typename R, typename... Args>
static panda::Local<panda::JSValueRef> StaticMethodCallback(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc,
void* data);
static panda::Local<panda::JSValueRef> StaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo);
static panda::Local<panda::JSValueRef> JSStaticMethodCallback(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc,
void* data);
static panda::Local<panda::JSValueRef> JSStaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo);
template<typename... Args>
static panda::Local<panda::JSValueRef> InternalConstructor(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, panda::Local<panda::JSValueRef> newTarget,
const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data);
static panda::Local<panda::JSValueRef> InternalConstructor(panda::JsiRuntimeCallInfo *runtimeCallInfo);
static panda::Local<panda::JSValueRef> ConstructorInterceptor(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, panda::Local<panda::JSValueRef> newTarget,
const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data);
static panda::Local<panda::JSValueRef> ConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo);
static void DestructorInterceptor(void* nativePtr, void* data);
static panda::Local<panda::JSValueRef> JSConstructorInterceptor(panda::ecmascript::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, panda::Local<panda::JSValueRef> newTarget,
const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data);
static panda::Local<panda::JSValueRef> JSConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo);
static bool CheckIfConstructCall(panda::ecmascript::EcmaVM* vm, panda::Local<panda::JSValueRef> thisObj,
panda::Local<panda::JSValueRef> newTarget, const panda::Local<panda::JSValueRef> argv[], int32_t argc,
void* data);
static bool CheckIfConstructCall(panda::JsiRuntimeCallInfo *runtimeCallInfo);
static thread_local std::unordered_map<std::string, panda::Global<panda::FunctionRef>> staticFunctions_;
static thread_local std::unordered_map<std::string, panda::Global<panda::FunctionRef>> customFunctions_;
@@ -74,7 +74,7 @@ void JsiClass<C>::Method(const char* name, R (Base::*func)(Args...), int id)
functionIds_.emplace_back(funcId);
customFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm,
panda::FunctionRef::New(vm, MethodCallback<Base, R, Args...>, funcId.get())));
panda::FunctionRef::New(vm, MethodCallback<Base, R, Args...>, nullptr, funcId.get())));
}
template<typename C>
@@ -87,9 +87,7 @@ void JsiClass<C>::CustomMethod(const char* name, MemberFunctionCallback<T> callb
functionIds_.emplace_back(funcId);
customFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
InternalMemberFunctionCallback<T, panda::EcmaVM*, panda::Local<panda::JSValueRef>,
const panda::Local<panda::JSValueRef>[], int32_t, void*>,
funcId.get())));
InternalMemberFunctionCallback<T, panda::JsiRuntimeCallInfo*>, nullptr, funcId.get())));
}
template<typename C>
@@ -98,7 +96,7 @@ void JsiClass<C>::CustomMethod(const char* name, FunctionCallback callback)
auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
auto vm = const_cast<EcmaVM*>(runtime->GetEcmaVm());
customFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, callback, nullptr)));
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, callback)));
}
template<typename C>
@@ -111,7 +109,7 @@ void JsiClass<C>::CustomMethod(const char* name, JSMemberFunctionCallback<T> cal
functionIds_.emplace_back(funcId);
customFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
InternalJSMemberFunctionCallback<T>, funcId.get())));
InternalJSMemberFunctionCallback<T>, nullptr, funcId.get())));
}
template<typename C>
@@ -125,17 +123,13 @@ void JsiClass<C>::CustomProperty(const char* name, MemberFunctionGetCallback<T>
customGetFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
InternalMemberFunctionCallback<T, panda::EcmaVM*, panda::Local<panda::JSValueRef>,
const panda::Local<panda::JSValueRef>[], int32_t, void*>,
funcGetId.get())));
InternalMemberFunctionCallback<T, panda::JsiRuntimeCallInfo*>, nullptr, funcGetId.get())));
auto funcSetId = std::make_shared<int32_t>(setterId);
functionIds_.emplace_back(funcSetId);
customSetFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
InternalMemberFunctionCallback<T, panda::EcmaVM*, panda::Local<panda::JSValueRef>,
const panda::Local<panda::JSValueRef>[], int32_t, void*>,
funcSetId.get())));
InternalMemberFunctionCallback<T, panda::JsiRuntimeCallInfo*>, nullptr, funcSetId.get())));
}
template<typename C>
@@ -144,9 +138,9 @@ void JsiClass<C>::CustomProperty(const char* name, FunctionGetCallback getter, F
auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
auto vm = const_cast<EcmaVM*>(runtime->GetEcmaVm());
customGetFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, getter, nullptr)));
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, getter)));
customSetFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, setter, nullptr)));
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, setter)));
}
template<typename C>
@@ -159,12 +153,12 @@ void JsiClass<C>::CustomProperty(const char* name, JSMemberFunctionCallback<T> c
functionIds_.emplace_back(funcGetId);
customGetFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
InternalJSMemberFunctionCallback<T>, funcGetId.get())));
InternalJSMemberFunctionCallback<T>, nullptr, funcGetId.get())));
auto funcSetId = std::make_shared<int32_t>(setterId);
functionIds_.emplace_back(funcSetId);
customSetFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
InternalJSMemberFunctionCallback<T>, funcSetId.get())));
InternalJSMemberFunctionCallback<T>, nullptr, funcSetId.get())));
}
template<typename C>
@@ -177,7 +171,7 @@ void JsiClass<C>::StaticMethod(const char* name, R (*func)(Args...), int id)
functionIds_.emplace_back(funcId);
staticFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
StaticMethodCallback<R, Args...>, funcId.get())));
StaticMethodCallback<R, Args...>, nullptr, funcId.get())));
}
template<typename C>
@@ -189,7 +183,7 @@ void JsiClass<C>::StaticMethod(const char* name, JSFunctionCallback func, int id
functionIds_.emplace_back(funcId);
staticFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm,
JSStaticMethodCallback, funcId.get())));
JSStaticMethodCallback, nullptr, funcId.get())));
}
template<typename C>
@@ -198,7 +192,7 @@ void JsiClass<C>::CustomStaticMethod(const char* name, FunctionCallback callback
auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
auto vm = const_cast<EcmaVM*>(runtime->GetEcmaVm());
staticFunctions_.emplace(
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, callback, nullptr)));
name, panda::Global<panda::FunctionRef>(vm, panda::FunctionRef::New(vm, callback)));
}
template<typename C>
@@ -240,7 +234,8 @@ void JsiClass<C>::Bind(BindingTarget t, FunctionCallback ctor)
}
}
t->Set(vm, panda::StringRef::NewFromUtf8(vm, ThisJSClass::JSName()), panda::Local<panda::JSValueRef>(classFunction_.ToLocal(vm)));
t->Set(vm, panda::StringRef::NewFromUtf8(vm, ThisJSClass::JSName()),
panda::Local<panda::JSValueRef>(classFunction_.ToLocal(vm)));
}
template<typename C>
@@ -348,34 +343,36 @@ std::unordered_map<std::string, panda::Global<panda::FunctionRef>>& JsiClass<C>:
template<typename C>
template<typename T, typename... Args>
panda::Local<panda::JSValueRef> JsiClass<C>::InternalMemberFunctionCallback(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::InternalMemberFunctionCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
panda::Local<panda::JSValueRef> thisObj = runtimeCallInfo->GetThisRef();
C* ptr = static_cast<C*>(panda::Local<panda::ObjectRef>(thisObj)->GetNativePointerField(0));
T* instance = static_cast<T*>(ptr);
int index = *(static_cast<int*>(data));
int index = *(static_cast<int*>(runtimeCallInfo->GetData()));
auto binding = ThisJSClass::GetFunctionBinding(index);
LOGD("InternalMemberFunctionCallback: Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name());
auto fnPtr = static_cast<FunctionBinding<T, panda::Local<panda::JSValueRef>, Args...>*>(binding)->Get();
(instance->*fnPtr)(vm, thisObj, argv, argc, data);
(instance->*fnPtr)(runtimeCallInfo);
}
template<typename C>
template<typename T>
panda::Local<panda::JSValueRef> JsiClass<C>::InternalJSMemberFunctionCallback(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::InternalJSMemberFunctionCallback(
panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
panda::Local<panda::JSValueRef> thisObj = runtimeCallInfo->GetThisRef();
C* ptr = static_cast<C*>(panda::Local<panda::ObjectRef>(thisObj)->GetNativePointerField(0));
T* instance = static_cast<T*>(ptr);
int index = *(static_cast<int*>(data));
int index = *(static_cast<int*>(runtimeCallInfo->GetData()));
auto binding = ThisJSClass::GetFunctionBinding(index);
LOGD("InternalmemberFunctionCallback: Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name());
auto fnPtr = static_cast<FunctionBinding<T, void, const JSCallbackInfo&>*>(binding)->Get();
JsiCallbackInfo info(vm, thisObj, argc, argv);
JsiCallbackInfo info(runtimeCallInfo);
(instance->*fnPtr)(info);
std::variant<void*, panda::Global<panda::JSValueRef>> retVal = info.GetReturnValue();
EcmaVM* vm = runtimeCallInfo->GetVM();
auto jsVal = std::get_if<panda::Global<panda::JSValueRef>>(&retVal);
if (jsVal) {
return jsVal->ToLocal(vm);
@@ -385,21 +382,22 @@ panda::Local<panda::JSValueRef> JsiClass<C>::InternalJSMemberFunctionCallback(pa
template<typename C>
template<typename Class, typename R, typename... Args>
panda::Local<panda::JSValueRef> JsiClass<C>::MethodCallback(EcmaVM* vm, panda::Local<panda::JSValueRef> thisObj,
const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::MethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
panda::Local<panda::JSValueRef> thisObj = runtimeCallInfo->GetThisRef();
C* ptr = static_cast<C*>(panda::Local<panda::ObjectRef>(thisObj)->GetNativePointerField(0));
Class* instance = static_cast<Class*>(ptr);
int index = *(static_cast<int*>(data));
int index = *(static_cast<int*>(runtimeCallInfo->GetData()));
auto binding = ThisJSClass::GetFunctionBinding(index);
LOGD("Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name());
auto fnPtr = static_cast<FunctionBinding<Class, R, Args...>*>(binding)->Get();
auto tuple = __detail__::ToTuple<std::decay_t<Args>...>(argv);
auto tuple = __detail__::ToTuple<std::decay_t<Args>...>(runtimeCallInfo);
bool returnSelf = binding->Options() & MethodOptions::RETURN_SELF;
constexpr bool isVoid = std::is_void_v<R>;
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<panda::JSValueRef> JsiClass<C>::MethodCallback(EcmaVM* vm, panda::L
template<typename C>
template<typename Class, typename R, typename... Args>
panda::Local<panda::JSValueRef> JsiClass<C>::JSMethodCallback(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::JSMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
panda::Local<panda::JSValueRef> thisObj = runtimeCallInfo->GetThisRef();
C* ptr = static_cast<C*>(panda::Local<panda::ObjectRef>(thisObj)->GetNativePointerField(0));
Class* instance = static_cast<Class*>(ptr);
int index = *(static_cast<int*>(data));
int index = *(static_cast<int*>(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<FunctionBinding<Class, R, Args...>*>(binding)->Get();
(instance->*fnPtr)(info);
}
template<typename C>
template<typename R, typename... Args>
panda::Local<panda::JSValueRef> JsiClass<C>::StaticMethodCallback(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::StaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
int index = *(static_cast<int*>(data));
int index = *(static_cast<int*>(runtimeCallInfo->GetData()));
auto binding = ThisJSClass::GetFunctionBinding(index);
LOGD("Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name());
auto fnPtr = static_cast<StaticFunctionBinding<R, Args...>*>(binding)->Get();
auto tuple = __detail__::ToTuple<std::decay_t<Args>...>(argv);
auto tuple = __detail__::ToTuple<std::decay_t<Args>...>(runtimeCallInfo);
bool returnSelf = binding->Options() & MethodOptions::RETURN_SELF;
constexpr bool isVoid = std::is_void_v<R>;
constexpr bool hasArguments = sizeof...(Args) != 0;
panda::Local<panda::JSValueRef> 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<panda::JSValueRef> JsiClass<C>::StaticMethodCallback(panda::EcmaVM*
}
template<typename C>
panda::Local<panda::JSValueRef> JsiClass<C>::JSStaticMethodCallback(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::JSStaticMethodCallback(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
int index = *(static_cast<int*>(data));
int index = *(static_cast<int*>(runtimeCallInfo->GetData()));
auto binding = ThisJSClass::GetFunctionBinding(index);
LOGD("Calling %{public}s::%{public}s", ThisJSClass::JSName(), binding->Name());
auto fnPtr = static_cast<StaticFunctionBinding<void, const JSCallbackInfo&>*>(binding)->Get();
JsiCallbackInfo info(vm, thisObj, argc, argv);
JsiCallbackInfo info(runtimeCallInfo);
fnPtr(info);
EcmaVM* vm = runtimeCallInfo->GetVM();
std::variant<void*, panda::Global<panda::JSValueRef>> retVal = info.GetReturnValue();
auto jsVal = std::get_if<panda::Global<panda::JSValueRef>>(&retVal);
if (jsVal) {
@@ -489,16 +487,15 @@ panda::Local<panda::JSValueRef> JsiClass<C>::JSStaticMethodCallback(panda::EcmaV
template<typename C>
template<typename... Args>
panda::Local<panda::JSValueRef> JsiClass<C>::InternalConstructor(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, panda::Local<JSValueRef> newTarget,
const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::InternalConstructor(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
panda::Local<panda::JSValueRef> newTarget = runtimeCallInfo->GetNewTargetRef();
if (!newTarget->IsFunction()) {
return panda::Local<panda::JSValueRef>(panda::JSValueRef::Undefined(vm));
return panda::Local<panda::JSValueRef>(panda::JSValueRef::Undefined(runtimeCallInfo->GetVM()));
}
JsiCallbackInfo info(vm, thisObj, argc, argv);
auto tuple = __detail__::ToTuple<std::decay_t<Args>...>(argv);
panda::Local<panda::JSValueRef> thisObj = runtimeCallInfo->GetThisRef();
auto tuple = __detail__::ToTuple<std::decay_t<Args>...>(runtimeCallInfo);
C* instance = FunctionUtils::ConstructFromTuple<C>(tuple);
Local<ObjectRef>(thisObj)->SetNativePointerFieldCount(1);
panda::Local<panda::ObjectRef>(thisObj)->SetNativePointerField(0, static_cast<void*>(instance));
@@ -506,31 +503,29 @@ panda::Local<panda::JSValueRef> JsiClass<C>::InternalConstructor(panda::EcmaVM*
}
template<typename C>
bool JsiClass<C>::CheckIfConstructCall(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> thisObj,
panda::Local<panda::JSValueRef> newTarget, const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
bool JsiClass<C>::CheckIfConstructCall(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
return true;
}
template<typename C>
panda::Local<panda::JSValueRef> JsiClass<C>::ConstructorInterceptor(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, panda::Local<panda::JSValueRef> newTarget,
const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::ConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
panda::Local<panda::JSValueRef> newTarget = runtimeCallInfo->GetNewTargetRef();
EcmaVM* vm = runtimeCallInfo->GetVM();
if (!newTarget->IsFunction()) {
return panda::Local<panda::JSValueRef>(panda::JSValueRef::Undefined(vm));
}
return constructor_(vm, thisObj, argv, argc, data);
return constructor_(runtimeCallInfo);
}
template<typename C>
panda::Local<panda::JSValueRef> JsiClass<C>::JSConstructorInterceptor(panda::EcmaVM* vm,
panda::Local<panda::JSValueRef> thisObj, panda::Local<panda::JSValueRef> newTarget,
const panda::Local<panda::JSValueRef> argv[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsiClass<C>::JSConstructorInterceptor(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
EcmaVM* vm = runtimeCallInfo->GetVM();
panda::Local<panda::JSValueRef> 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<panda::JSValueRef> JsiClass<C>::JSConstructorInterceptor(panda::Ecm
}
auto instance = std::get_if<void*>(&retVal);
if (instance) {
panda::Local<panda::JSValueRef> thisObj = runtimeCallInfo->GetThisRef();
Local<ObjectRef>(thisObj)->SetNativePointerFieldCount(1);
Local<ObjectRef>(thisObj)->SetNativePointerField(0, *instance, &JsiClass<C>::DestructorInterceptor);
LOGD("Constructed %{public}s", ThisJSClass::JSName());
@@ -244,7 +244,7 @@ JsiRef<JsiValue> JsiFunction::Call(JsiRef<JsiValue> thisVal, int argc, JsiRef<Js
panda::Local<panda::FunctionRef> JsiFunction::New(JsiFunctionCallback func)
{
auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
return panda::FunctionRef::New(const_cast<EcmaVM*>(runtime->GetEcmaVm()), func, nullptr);
return panda::FunctionRef::New(const_cast<EcmaVM*>(runtime->GetEcmaVm()), func);
}
// -----------------------
@@ -274,33 +274,20 @@ panda::Local<panda::JSValueRef> JsiObjTemplate::New()
// -----------------------
// Implementation of JsiCallBackInfo
// -----------------------
JsiCallbackInfo::JsiCallbackInfo(panda::ecmascript::EcmaVM* vm, panda::Local<panda::JSValueRef> thisObj, int32_t argc,
const panda::Local<panda::JSValueRef>* 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<panda::Global<panda::JSValueRef>>(&retVal_);
if (jsVal) {
jsVal->FreeGlobalHandleAddr();
}
for (int i = 0; i < argc_; i++) {
argv_[i].FreeGlobalHandleAddr();
}
argv_.clear();
}
JsiRef<JsiValue> JsiCallbackInfo::operator[](size_t index) const
{
if (static_cast<int32_t>(index) < argc_) {
return JsiRef<JsiValue>::Make(argv_[index].ToLocal(vm_));
if (static_cast<int32_t>(index) < Length()) {
return JsiRef<JsiValue>::Make(info_->GetCallArgRef(index));
}
auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
return JsiRef<JsiValue>::Make(panda::JSValueRef::Undefined(runtime->GetEcmaVm()));
@@ -308,19 +295,20 @@ JsiRef<JsiValue> JsiCallbackInfo::operator[](size_t index) const
JsiRef<JsiObject> JsiCallbackInfo::This() const
{
auto obj = JsiObject { thisObj_.ToLocal(vm_) };
auto obj = JsiObject { info_->GetThisRef() };
auto ref = JsiRef<JsiObject>(obj);
return ref;
}
int JsiCallbackInfo::Length() const
{
return argc_;
return info_->GetArgsNumber();
}
void JsiCallbackInfo::ReturnSelf() const
{
retVal_ = thisObj_;
panda::Global<panda::JSValueRef> thisObj(info_->GetVM(), info_->GetThisRef());
retVal_ = thisObj;
}
} // namespace OHOS::Ace::Framework
@@ -30,8 +30,7 @@
namespace OHOS::Ace::Framework {
using JsiFunctionCallback = panda::Local<panda::JSValueRef> (*)(panda::ecmascript::EcmaVM*,
panda::Local<panda::JSValueRef>, const panda::Local<panda::JSValueRef>[], int32_t, void*);
using JsiFunctionCallback = panda::Local<panda::JSValueRef> (*)(panda::JsiRuntimeCallInfo*);
template<typename T>
class JsiType {
@@ -174,8 +173,7 @@ struct JsiExecutionContext {
class JsiCallbackInfo {
public:
JsiCallbackInfo(panda::ecmascript::EcmaVM* vm, panda::Local<panda::JSValueRef> thisObj, int32_t argc,
const panda::Local<panda::JSValueRef>* 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<panda::JSValueRef> thisObj_;
int argc_;
std::vector<panda::Global<panda::JSValueRef>> argv_;
panda::JsiRuntimeCallInfo* info_ = nullptr;
mutable std::variant<void*, panda::Global<panda::JSValueRef>> retVal_;
};
@@ -174,7 +174,7 @@ void JsiCallbackInfo::SetReturnValue(T* instance) const
template<typename T>
void JsiCallbackInfo::SetReturnValue(JsiRef<T> val) const
{
retVal_ = panda::Global<panda::JSValueRef>(vm_, val.Get().GetHandle());
retVal_ = panda::Global<panda::JSValueRef>(info_->GetVM(), val.Get().GetHandle());
}
template<typename... Args>
@@ -153,20 +153,22 @@
namespace OHOS::Ace::Framework {
panda::Local<panda::JSValueRef> JsLoadDocument(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
if (!firstArg->IsObject()) {
LOGE("The arg is wrong, value must be object");
return panda::JSValueRef::Undefined(vm);
}
panda::Local<panda::ObjectRef> obj = args[0]->ToObject(vm);
panda::Local<panda::ObjectRef> obj = firstArg->ToObject(vm);
JSView* view = static_cast<JSView*>(obj->GetNativePointerField(0));
auto runtime = JsiDeclarativeEngineInstance::GetCurrentRuntime();
@@ -201,17 +203,18 @@ panda::Local<panda::JSValueRef> JsLoadDocument(panda::EcmaVM* vm, panda::Local<p
return panda::JSValueRef::Undefined(vm);
}
panda::Local<panda::JSValueRef> JsDumpMemoryStats(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> JsDumpMemoryStats(panda::JsiRuntimeCallInfo *runtimeCallInfo)
{
LOGD("dumpMemoryStats: Not Implemented for ARK. UnSupported");
EcmaVM* vm = runtimeCallInfo->GetVM();
return panda::JSValueRef::Undefined(vm);
}
panda::Local<panda::JSValueRef> JsGetI18nResource(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<panda::JSValueRef> 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<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
if (!firstArg->IsString()) {
LOGE("The arg is wrong, value must be string");
return panda::JSValueRef::Undefined(vm);
}
std::vector<std::string> 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<panda::JSValueRef> 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<panda::ArrayRef>(args[1]);
Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
if (secondArg->IsArray(vm)) {
auto arrayVal = panda::Local<panda::ArrayRef>(secondArg);
auto len = arrayVal->Length(vm);
std::vector<std::string> arrayResult;
for (int32_t i = 0; i < len; i++) {
@@ -253,15 +258,15 @@ panda::Local<panda::JSValueRef> 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<panda::StringRef>(value);
std::unique_ptr<JsonValue> 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<panda::JSValueRef> JsGetI18nResource(panda::EcmaVM* vm, panda::Loca
return panda::StringRef::NewFromUtf8(vm, resultStr.c_str());
}
panda::Local<panda::JSValueRef> JsGetMediaResource(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<FrontendDelegate> JsGetFrontendDelegate()
return engineInstance->GetDelegate();
}
panda::Local<panda::JSValueRef> JsGetInspectorNodes(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<panda::JSValueRef> JsGetInspectorNodes(panda::EcmaVM* vm, panda::Lo
return panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, nodeInfos->ToString().c_str()));
}
panda::Local<panda::JSValueRef> JsGetInspectorNodeById(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> 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<panda::JSValueRef> JsGetInspectorTree(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<panda::JSValueRef> JsGetInspectorTree(panda::EcmaVM* vm, panda::Loc
return panda::StringRef::NewFromUtf8(vm, nodeInfos.c_str());
}
panda::Local<panda::JSValueRef> JsGetInspectorByKey(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> 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<panda::JSValueRef> JsSendEventByKey(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> 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<panda::JSValueRef> JsSendTouchEvent(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> 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<panda::JSValueRef> JsSendKeyEvent(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> JsSendKeyEvent(panda::EcmaVM* vm, panda::Local<p
LOGE("pipelineContext==nullptr");
return panda::JSValueRef::Undefined(vm);
}
JsiObject obj(args[0]);
JsiObject obj(firstArg);
auto result = V2::Inspector::SendKeyEvent(pipelineContext, GetKeyEventFromJS(obj));
return panda::BooleanRef::New(vm, result);
}
@@ -550,14 +567,16 @@ static MouseEvent GetMouseEventFromJS(const JsiObject& value)
return mouseEvent;
}
panda::Local<panda::JSValueRef> JsSendMouseEvent(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> 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<panda::JSValueRef> Vp2Px(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> Px2Vp(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> Px2Vp(panda::EcmaVM* vm, panda::Local<panda::JSV
return panda::JSValueRef::Undefined(vm);
}
double pxValue = args[0]->ToNumber(vm)->Value();
double pxValue = firstArg->ToNumber(vm)->Value();
double vpValue = pxValue / density;
return panda::NumberRef::New(vm, vpValue);
}
panda::Local<panda::JSValueRef> Fp2Px(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> Fp2Px(panda::EcmaVM* vm, panda::Local<panda::JSV
return panda::NumberRef::New(vm, pxValue);
}
panda::Local<panda::JSValueRef> Px2Fp(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> Px2Fp(panda::EcmaVM* vm, panda::Local<panda::JSV
return panda::JSValueRef::Undefined(vm);
}
double pxValue = args[0]->ToNumber(vm)->Value();
double pxValue = firstArg->ToNumber(vm)->Value();
auto container = Container::Current();
if (!container) {
LOGW("container is null");
@@ -682,14 +709,16 @@ panda::Local<panda::JSValueRef> Px2Fp(panda::EcmaVM* vm, panda::Local<panda::JSV
return panda::NumberRef::New(vm, fpValue);
}
panda::Local<panda::JSValueRef> Lpx2Px(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> Lpx2Px(panda::EcmaVM* vm, panda::Local<panda::JS
auto pipelineContext = container->GetPipelineContext();
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<panda::JSValueRef> Px2Lpx(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::JSValueRef> Px2Lpx(panda::EcmaVM* vm, panda::Local<panda::JS
auto pipelineContext = container->GetPipelineContext();
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<panda::JSValueRef> SetAppBackgroundColor(panda::EcmaVM* vm, panda::Local<panda::JSValueRef> value,
const panda::Local<panda::JSValueRef> args[], int32_t argc, void* data)
panda::Local<panda::JSValueRef> 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<JSValueRef> 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<panda::EcmaVM*>(vm), JsLoadDocument, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsLoadDocument));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "dumpMemoryStats"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsDumpMemoryStats, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsDumpMemoryStats));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$s"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetI18nResource, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetI18nResource));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$m"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetMediaResource, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetMediaResource));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodes"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodes, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodes));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodeById"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodeById, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodeById));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorTree"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorTree, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorTree));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorByKey"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorByKey, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorByKey));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendEventByKey"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendEventByKey, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendEventByKey));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendTouchEvent"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendTouchEvent, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendTouchEvent));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendKeyEvent"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendKeyEvent, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendKeyEvent));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendMouseEvent"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendMouseEvent, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendMouseEvent));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "vp2px"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Vp2Px, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Vp2Px));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2vp"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Vp, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Vp));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "fp2px"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Fp2Px, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Fp2Px));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2fp"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Fp, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Fp));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "lpx2px"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Lpx2Px, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Lpx2Px));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2lpx"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Lpx, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Lpx));
globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "setAppBgColor"),
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), SetAppBackgroundColor, nullptr));
panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), SetAppBackgroundColor));
JSViewAbstract::JSBind();
JSContainerBase::JSBind();
@@ -24,15 +24,13 @@ namespace OHOS::Ace::Framework {
// NOLINTNEXTLINE(readability-identifier-naming)
static constexpr auto PANDA_MAIN_FUNCTION = "_GLOBAL::func_main_0";
Local<JSValueRef> FunctionCallback(EcmaVM *vm, Local<JSValueRef> thisValue,
const Local<JSValueRef> argument[], // NOLINT(modernize-avoid-c-arrays)
int32_t length, void *data)
Local<JSValueRef> FunctionCallback(panda::JsiRuntimeCallInfo *info)
{
auto package = reinterpret_cast<PandaFunctionData *>(data);
auto package = reinterpret_cast<PandaFunctionData *>(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<JsValue> ArkJSRuntime::NewFunction(RegisterFunctionType func)
LocalScope scope(vm_);
auto data = new PandaFunctionData(shared_from_this(), func);
dataList_.emplace_back(data);
return std::make_shared<ArkJSValue>(shared_from_this(), FunctionRef::New(vm_, FunctionCallback, data));
return std::make_shared<ArkJSValue>(shared_from_this(), FunctionRef::New(vm_, FunctionCallback, nullptr, data));
}
shared_ptr<JsValue> ArkJSRuntime::NewNativePointer(void *ptr)
@@ -220,18 +218,18 @@ void ArkJSRuntime::ExecutePendingJob()
JSNApi::ExecutePendingJob(vm_);
}
Local<JSValueRef> PandaFunctionData::Callback(const Local<JSValueRef> &thisValue,
const Local<JSValueRef> argument[], // NOLINT(modernize-avoid-c-arrays)
int32_t length) const
Local<JSValueRef> PandaFunctionData::Callback(panda::JsiRuntimeCallInfo *info) const
{
EscapeLocalScope scope(runtime_->GetEcmaVm());
shared_ptr<JsValue> thisPtr = std::static_pointer_cast<JsValue>(std::make_shared<ArkJSValue>(runtime_, thisValue));
shared_ptr<JsValue> thisPtr =
std::static_pointer_cast<JsValue>(std::make_shared<ArkJSValue>(runtime_, info->GetThisRef()));
std::vector<shared_ptr<JsValue>> 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<JsValue>(std::make_shared<ArkJSValue>(runtime_, argument[i])));
argv.emplace_back(
std::static_pointer_cast<JsValue>(std::make_shared<ArkJSValue>(runtime_, info->GetCallArgRef(i))));
}
shared_ptr<JsValue> result = func_(runtime_, thisPtr, argv, length);
return scope.Escape(std::static_pointer_cast<ArkJSValue>(result)->GetValue(runtime_));
@@ -106,14 +106,10 @@ public:
NO_MOVE_SEMANTIC(PandaFunctionData);
private:
Local<JSValueRef> Callback(const Local<JSValueRef> &thisValue,
const Local<JSValueRef> argument[], // NOLINT(modernize-avoid-c-arrays)
int32_t length) const;
Local<JSValueRef> Callback(panda::JsiRuntimeCallInfo *info) const;
shared_ptr<ArkJSRuntime> runtime_;
RegisterFunctionType func_;
friend Local<JSValueRef> FunctionCallback(EcmaVM *vm, Local<JSValueRef> thisValue,
const Local<JSValueRef> argument[], // NOLINT(modernize-avoid-c-arrays)
int32_t length, void *data);
friend Local<JSValueRef> FunctionCallback(panda::JsiRuntimeCallInfo *info);
};
} // namespace OHOS::Ace::Framework
#endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_ENGINE_JSI_ARK_JS_RUNTIME_H