1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_JSI_VALUE_CONVERSIONS_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_JSI_VALUE_CONVERSIONS_H
18
19 #include "ecmascript/napi/include/jsnapi.h"
20
21 #include "base/log/log.h"
22 #include "frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h"
23 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h"
24
25 namespace OHOS::Ace::Framework {
26 namespace JsiValueConvertor {
27
28 template<typename T>
Validate(const EcmaVM * vm,panda::Local<panda::JSValueRef> val)29 bool Validate(const EcmaVM* vm, panda::Local<panda::JSValueRef> val)
30 {
31 if constexpr (std::is_integral<T>::value && std::is_signed<T>::value && !std::is_same<T, bool>::value) {
32 return val->IsInt();
33 } else if constexpr (std::is_unsigned_v<T>) {
34 return val->WithinInt32();
35 } else if constexpr (std::is_floating_point_v<T>) {
36 return val->IsNumber();
37 } else if constexpr (std::is_same_v<T, std::string>) {
38 return val->IsString(vm);
39 } else {
40 return false;
41 }
42 }
43
44 template<typename T>
fromJsiValue(const EcmaVM * vm,Local<panda::JSValueRef> val)45 T fromJsiValue(const EcmaVM* vm, Local<panda::JSValueRef> val)
46 {
47 static_assert(!std::is_const_v<T> && !std::is_reference_v<T>, //
48 "Cannot convert values to reference or cv-qualified types!");
49
50 if constexpr (std::is_integral<T>::value && std::is_signed<T>::value && !std::is_same<T, bool>::value) {
51 return std::is_same<T, int64_t>::value ? val->IntegerValue(vm) : val->Int32Value(vm);
52 } else if constexpr (std::is_unsigned_v<T>) {
53 return val->Uint32Value(vm);
54 } else if constexpr (std::is_floating_point_v<T>) {
55 return val->ToNumber(vm)->Value();
56 } else if constexpr (std::is_same_v<T, std::string>) {
57 return val->ToString(vm)->ToString(vm);
58 }
59
60 return T();
61 }
62
63 template<typename T>
toJsiValueWithVM(const EcmaVM * vm,T val)64 panda::Local<panda::JSValueRef> toJsiValueWithVM(const EcmaVM* vm, T val)
65 {
66 if constexpr (std::is_same_v<T, bool>) {
67 return panda::BooleanRef::New(vm, val);
68 } else if constexpr (std::is_same_v<T, int64_t>) {
69 return panda::NumberRef::New(vm, val);
70 } else if constexpr (std::is_integral<T>::value && std::is_signed<T>::value) {
71 return panda::IntegerRef::New(vm, val);
72 } else if constexpr (std::is_unsigned_v<T>) {
73 return panda::IntegerRef::NewFromUnsigned(vm, val);
74 } else if constexpr (std::is_floating_point_v<T>) {
75 return panda::NumberRef::New(vm, val);
76 } else if constexpr (std::is_same_v<T, std::string>) {
77 return panda::StringRef::NewFromUtf8(vm, val.c_str());
78 } else if constexpr (std::is_same_v<T, const char*>) {
79 return panda::StringRef::NewFromUtf8(vm, val);
80 }
81
82 return panda::JSValueRef::Undefined(vm);
83 }
84
85 template<typename T>
toJsiValue(T val)86 panda::Local<panda::JSValueRef> toJsiValue(T val)
87 {
88 auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
89 auto vm = runtime->GetEcmaVm();
90 return toJsiValueWithVM(vm, val);
91 }
92
getEcmaVm()93 inline const panda::ecmascript::EcmaVM* getEcmaVm()
94 {
95 auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
96 return runtime->GetEcmaVm();
97 }
98
99 } // namespace JsiValueConvertor
100 } // namespace OHOS::Ace::Framework
101
102 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_JSI_VALUE_CONVERSIONS_H
103