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