• 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->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