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->IsJSArray(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 Global<JSValueRef> value = value_;
108 return value->IsBuffer();
109 }
110
IsDate()111 bool ArkNativeValue::IsDate()
112 {
113 Global<JSValueRef> value = value_;
114 return value->IsDate();
115 }
116
IsError()117 bool ArkNativeValue::IsError()
118 {
119 Global<JSValueRef> value = value_;
120 return value->IsError();
121 }
122
IsTypedArray()123 bool ArkNativeValue::IsTypedArray()
124 {
125 Global<JSValueRef> value = value_;
126 return value->IsTypedArray();
127 }
128
IsDataView()129 bool ArkNativeValue::IsDataView()
130 {
131 Global<JSValueRef> value = value_;
132 return value->IsDataView();
133 }
134
IsPromise()135 bool ArkNativeValue::IsPromise()
136 {
137 Global<JSValueRef> value = value_;
138 return value->IsPromise();
139 }
140
IsCallable()141 bool ArkNativeValue::IsCallable()
142 {
143 Global<JSValueRef> value = value_;
144 return value->IsFunction();
145 }
146
IsArgumentsObject()147 bool ArkNativeValue::IsArgumentsObject()
148 {
149 Global<JSValueRef> value = value_;
150 return value->IsArgumentsObject();
151 }
152
IsAsyncFunction()153 bool ArkNativeValue::IsAsyncFunction()
154 {
155 Global<JSValueRef> value = value_;
156 return value->IsAsyncFunction();
157 }
158
IsBooleanObject()159 bool ArkNativeValue::IsBooleanObject()
160 {
161 Global<JSValueRef> value = value_;
162 return value->IsJSPrimitiveBoolean();
163 }
164
IsGeneratorFunction()165 bool ArkNativeValue::IsGeneratorFunction()
166 {
167 Global<JSValueRef> value = value_;
168 return value->IsGeneratorFunction();
169 }
170
IsGeneratorObject()171 bool ArkNativeValue::IsGeneratorObject()
172 {
173 Global<JSValueRef> value = value_;
174 return value->IsGeneratorObject();
175 }
176
IsMap()177 bool ArkNativeValue::IsMap()
178 {
179 Global<JSValueRef> value = value_;
180 return value->IsMap();
181 }
182
IsMapIterator()183 bool ArkNativeValue::IsMapIterator()
184 {
185 Global<JSValueRef> value = value_;
186 return value->IsMapIterator();
187 }
188
IsModuleNamespaceObject()189 bool ArkNativeValue::IsModuleNamespaceObject()
190 {
191 Global<JSValueRef> value = value_;
192 return value->IsModuleNamespaceObject();
193 }
194
IsNumberObject()195 bool ArkNativeValue::IsNumberObject()
196 {
197 Global<JSValueRef> value = value_;
198 return value->IsJSPrimitiveNumber();
199 }
200
IsProxy()201 bool ArkNativeValue::IsProxy()
202 {
203 Global<JSValueRef> value = value_;
204 return value->IsProxy();
205 }
206
IsRegExp()207 bool ArkNativeValue::IsRegExp()
208 {
209 Global<JSValueRef> value = value_;
210 return value->IsRegExp();
211 }
212
IsSet()213 bool ArkNativeValue::IsSet()
214 {
215 Global<JSValueRef> value = value_;
216 return value->IsSet();
217 }
218
IsSetIterator()219 bool ArkNativeValue::IsSetIterator()
220 {
221 Global<JSValueRef> value = value_;
222 return value->IsSetIterator();
223 }
224
IsStringObject()225 bool ArkNativeValue::IsStringObject()
226 {
227 Global<JSValueRef> value = value_;
228 return value->IsJSPrimitiveString();
229 }
230
IsSymbolObject()231 bool ArkNativeValue::IsSymbolObject()
232 {
233 Global<JSValueRef> value = value_;
234 return value->IsJSPrimitiveSymbol();
235 }
236
IsWeakMap()237 bool ArkNativeValue::IsWeakMap()
238 {
239 Global<JSValueRef> value = value_;
240 return value->IsWeakMap();
241 }
242
IsWeakSet()243 bool ArkNativeValue::IsWeakSet()
244 {
245 Global<JSValueRef> value = value_;
246 return value->IsWeakSet();
247 }
248
ToBoolean()249 NativeValue* ArkNativeValue::ToBoolean()
250 {
251 auto vm = engine_->GetEcmaVm();
252 LocalScope scope(vm);
253 Global<JSValueRef> value = value_;
254 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToBoolean(vm));
255 }
256
ToNumber()257 NativeValue* ArkNativeValue::ToNumber()
258 {
259 auto vm = engine_->GetEcmaVm();
260 LocalScope scope(vm);
261 Global<JSValueRef> value = value_;
262 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToNumber(vm));
263 }
264
ToString()265 NativeValue* ArkNativeValue::ToString()
266 {
267 auto vm = engine_->GetEcmaVm();
268 LocalScope scope(vm);
269 Global<JSValueRef> value = value_;
270 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToString(vm));
271 }
272
ToObject()273 NativeValue* ArkNativeValue::ToObject()
274 {
275 auto vm = engine_->GetEcmaVm();
276 LocalScope scope(vm);
277 Global<JSValueRef> value = value_;
278 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->ToObject(vm));
279 }
280
StrictEquals(NativeValue * value)281 bool ArkNativeValue::StrictEquals(NativeValue* value)
282 {
283 auto vm = engine_->GetEcmaVm();
284 LocalScope scope(vm);
285 Global<JSValueRef> value1 = value_;
286 Global<JSValueRef> value2 = *value;
287 return value1->IsStrictEquals(vm, value2.ToLocal(vm));
288 }
289
IsBigInt64Array()290 bool ArkNativeValue::IsBigInt64Array()
291 {
292 Global<JSValueRef> value = value_;
293 return value->IsBigInt64Array();
294 }
295
IsBigUint64Array()296 bool ArkNativeValue::IsBigUint64Array()
297 {
298 Global<JSValueRef> value = value_;
299 return value->IsBigUint64Array();
300 }
301
IsSharedArrayBuffer()302 bool ArkNativeValue::IsSharedArrayBuffer()
303 {
304 Global<JSValueRef> value = value_;
305 return value->IsSharedArrayBuffer();
306 }
307