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 #include "ark_native_value.h"
17
ArkNativeValue(ArkNativeEngine * engine,Local<JSValueRef> value)18 ArkNativeValue::ArkNativeValue(ArkNativeEngine* engine, Local<JSValueRef> value)
19 {
20 engine_ = engine;
21 Global<JSValueRef> globalValue(engine->GetEcmaVm(), value);
22 value_ = globalValue;
23
24 NativeScopeManager* scopeManager = engine_->GetScopeManager();
25 if (scopeManager != nullptr) {
26 scopeManager->CreateHandle(this);
27 }
28 }
29
~ArkNativeValue()30 ArkNativeValue::~ArkNativeValue()
31 {
32 // Addr of Global stored in ArkNativeValue should be released.
33 Global<JSValueRef> oldValue = value_;
34 oldValue.FreeGlobalHandleAddr();
35 }
36
GetInterface(int interfaceId)37 void* ArkNativeValue::GetInterface(int interfaceId)
38 {
39 return nullptr;
40 }
41
UpdateValue(Local<JSValueRef> value)42 void ArkNativeValue::UpdateValue(Local<JSValueRef> value)
43 {
44 auto vm = engine_->GetEcmaVm();
45 Global<JSValueRef> oldValue = value_;
46 oldValue.FreeGlobalHandleAddr();
47
48 Global<JSValueRef> newValue(vm, value);
49 value_ = newValue;
50 }
51
TypeOf()52 NativeValueType ArkNativeValue::TypeOf()
53 {
54 Global<JSValueRef> value = value_;
55 NativeValueType result;
56
57 if (value->IsNumber()) {
58 result = NATIVE_NUMBER;
59 } else if (value->IsString()) {
60 result = NATIVE_STRING;
61 } else if (value->IsFunction()) {
62 result = NATIVE_FUNCTION;
63 } else if (value->IsNativePointer()) {
64 result = NATIVE_EXTERNAL;
65 } else if (value->IsNull()) {
66 result = NATIVE_NULL;
67 } else if (value->IsBoolean()) {
68 result = NATIVE_BOOLEAN;
69 } else if (value->IsUndefined()) {
70 result = NATIVE_UNDEFINED;
71 } else if (value->IsSymbol()) {
72 result = NATIVE_SYMBOL;
73 } else if (value->IsBigInt()) {
74 result = NATIVE_BIGINT;
75 } else if (value->IsObject()) {
76 result = NATIVE_OBJECT;
77 } else {
78 result = NATIVE_UNDEFINED;
79 }
80
81 return result;
82 }
83
InstanceOf(NativeValue * obj)84 bool ArkNativeValue::InstanceOf(NativeValue* obj)
85 {
86 auto vm = engine_->GetEcmaVm();
87 LocalScope scope(vm);
88 Global<JSValueRef> value = value_;
89 Global<JSValueRef> object = *obj;
90 return value->InstanceOf(vm, object.ToLocal(vm));
91 }
92
IsArray()93 bool ArkNativeValue::IsArray()
94 {
95 Global<JSValueRef> value = value_;
96 return value->IsArray(engine_->GetEcmaVm());
97 }
98
IsArrayBuffer()99 bool ArkNativeValue::IsArrayBuffer()
100 {
101 Global<JSValueRef> value = value_;
102 return value->IsArrayBuffer();
103 }
104
IsBuffer()105 bool ArkNativeValue::IsBuffer()
106 {
107 return false;
108 }
109
IsDate()110 bool ArkNativeValue::IsDate()
111 {
112 Global<JSValueRef> value = value_;
113 return value->IsDate();
114 }
115
IsError()116 bool ArkNativeValue::IsError()
117 {
118 Global<JSValueRef> value = value_;
119 return value->IsError();
120 }
121
IsTypedArray()122 bool ArkNativeValue::IsTypedArray()
123 {
124 Global<JSValueRef> value = value_;
125 return value->IsTypedArray();
126 }
127
IsDataView()128 bool ArkNativeValue::IsDataView()
129 {
130 Global<JSValueRef> value = value_;
131 return value->IsDataView();
132 }
133
IsPromise()134 bool ArkNativeValue::IsPromise()
135 {
136 Global<JSValueRef> value = value_;
137 return value->IsPromise();
138 }
139
IsCallable()140 bool ArkNativeValue::IsCallable()
141 {
142 Global<JSValueRef> value = value_;
143 return value->IsFunction();
144 }
145
IsArgumentsObject()146 bool ArkNativeValue::IsArgumentsObject()
147 {
148 Global<JSValueRef> value = value_;
149 return value->IsArgumentsObject();
150 }
151
IsAsyncFunction()152 bool ArkNativeValue::IsAsyncFunction()
153 {
154 Global<JSValueRef> value = value_;
155 return value->IsAsyncFunction();
156 }
157
IsBooleanObject()158 bool ArkNativeValue::IsBooleanObject()
159 {
160 Global<JSValueRef> value = value_;
161 return value->IsJSPrimitiveBoolean();
162 }
163
IsGeneratorFunction()164 bool ArkNativeValue::IsGeneratorFunction()
165 {
166 Global<JSValueRef> value = value_;
167 return value->IsGeneratorFunction();
168 }
169
IsGeneratorObject()170 bool ArkNativeValue::IsGeneratorObject()
171 {
172 Global<JSValueRef> value = value_;
173 return value->IsGeneratorObject();
174 }
175
IsMap()176 bool ArkNativeValue::IsMap()
177 {
178 Global<JSValueRef> value = value_;
179 return value->IsMap();
180 }
181
IsMapIterator()182 bool ArkNativeValue::IsMapIterator()
183 {
184 Global<JSValueRef> value = value_;
185 return value->IsMapIterator();
186 }
187
IsModuleNamespaceObject()188 bool ArkNativeValue::IsModuleNamespaceObject()
189 {
190 Global<JSValueRef> value = value_;
191 return value->IsModuleNamespaceObject();
192 }
193
IsNumberObject()194 bool ArkNativeValue::IsNumberObject()
195 {
196 Global<JSValueRef> value = value_;
197 return value->IsJSPrimitiveNumber();
198 }
199
IsProxy()200 bool ArkNativeValue::IsProxy()
201 {
202 Global<JSValueRef> value = value_;
203 return value->IsProxy();
204 }
205
IsRegExp()206 bool ArkNativeValue::IsRegExp()
207 {
208 Global<JSValueRef> value = value_;
209 return value->IsRegExp();
210 }
211
IsSet()212 bool ArkNativeValue::IsSet()
213 {
214 Global<JSValueRef> value = value_;
215 return value->IsSet();
216 }
217
IsSetIterator()218 bool ArkNativeValue::IsSetIterator()
219 {
220 Global<JSValueRef> value = value_;
221 return value->IsSetIterator();
222 }
223
IsStringObject()224 bool ArkNativeValue::IsStringObject()
225 {
226 Global<JSValueRef> value = value_;
227 return value->IsJSPrimitiveString();
228 }
229
IsSymbolObject()230 bool ArkNativeValue::IsSymbolObject()
231 {
232 Global<JSValueRef> value = value_;
233 return value->IsJSPrimitiveSymbol();
234 }
235
IsWeakMap()236 bool ArkNativeValue::IsWeakMap()
237 {
238 Global<JSValueRef> value = value_;
239 return value->IsWeakMap();
240 }
241
IsWeakSet()242 bool ArkNativeValue::IsWeakSet()
243 {
244 Global<JSValueRef> value = value_;
245 return value->IsWeakSet();
246 }
247
ToBoolean()248 NativeValue* ArkNativeValue::ToBoolean()
249 {
250 auto vm = engine_->GetEcmaVm();
251 LocalScope scope(vm);
252 Global<JSValueRef> value = value_;
253 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToBoolean(vm));
254 }
255
ToNumber()256 NativeValue* ArkNativeValue::ToNumber()
257 {
258 auto vm = engine_->GetEcmaVm();
259 LocalScope scope(vm);
260 Global<JSValueRef> value = value_;
261 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToNumber(vm));
262 }
263
ToString()264 NativeValue* ArkNativeValue::ToString()
265 {
266 auto vm = engine_->GetEcmaVm();
267 LocalScope scope(vm);
268 Global<JSValueRef> value = value_;
269 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToString(vm));
270 }
271
ToObject()272 NativeValue* ArkNativeValue::ToObject()
273 {
274 auto vm = engine_->GetEcmaVm();
275 LocalScope scope(vm);
276 Global<JSValueRef> value = value_;
277 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToObject(vm));
278 }
279
StrictEquals(NativeValue * value)280 bool ArkNativeValue::StrictEquals(NativeValue* value)
281 {
282 auto vm = engine_->GetEcmaVm();
283 LocalScope scope(vm);
284 Global<JSValueRef> value1 = value_;
285 Global<JSValueRef> value2 = *value;
286 return value1->IsStrictEquals(vm, value2.ToLocal(vm));
287 }
288
IsBigInt64Array()289 bool ArkNativeValue::IsBigInt64Array()
290 {
291 Global<JSValueRef> value = value_;
292 return value->IsBigInt64Array();
293 }
294
IsBigUint64Array()295 bool ArkNativeValue::IsBigUint64Array()
296 {
297 Global<JSValueRef> value = value_;
298 return value->IsBigUint64Array();
299 }
300
IsSharedArrayBuffer()301 bool ArkNativeValue::IsSharedArrayBuffer()
302 {
303 Global<JSValueRef> value = value_;
304 return value->IsSharedArrayBuffer();
305 }
306