• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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