mirror of
https://github.com/openharmony/ace_ace_engine.git
synced 2026-07-19 22:54:50 -04:00
!890 FFI optimization for ace_engine
Merge pull request !890 from guobingbing/master
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user