• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 #ifndef NAPI_EXPERIMENTAL
16 #define NAPI_EXPERIMENTAL
17 #endif
18 
19 #include "native_api_internal.h"
20 #include "native_engine/native_property.h"
21 #include "native_engine/native_value.h"
22 #include "securec.h"
23 #include "utils/log.h"
24 
napi_get_last_error_info(napi_env env,const napi_extended_error_info ** result)25 NAPI_EXTERN napi_status napi_get_last_error_info(napi_env env, const napi_extended_error_info** result)
26 {
27     CHECK_ENV(env);
28     CHECK_ARG(env, result);
29 
30     auto engine = reinterpret_cast<NativeEngine*>(env);
31 
32     *result = reinterpret_cast<napi_extended_error_info*>(engine->GetLastError());
33 
34     return napi_clear_last_error(env);
35 }
36 
37 // Getters for defined singletons
napi_get_undefined(napi_env env,napi_value * result)38 NAPI_EXTERN napi_status napi_get_undefined(napi_env env, napi_value* result)
39 {
40     CHECK_ENV(env);
41     CHECK_ARG(env, result);
42 
43     auto engine = reinterpret_cast<NativeEngine*>(env);
44     auto resultValue = engine->CreateUndefined();
45 
46     *result = reinterpret_cast<napi_value>(resultValue);
47     return napi_clear_last_error(env);
48 }
49 
napi_get_null(napi_env env,napi_value * result)50 NAPI_EXTERN napi_status napi_get_null(napi_env env, napi_value* result)
51 {
52     CHECK_ENV(env);
53     CHECK_ARG(env, result);
54 
55     auto engine = reinterpret_cast<NativeEngine*>(env);
56     auto resultValue = engine->CreateNull();
57 
58     *result = reinterpret_cast<napi_value>(resultValue);
59     return napi_clear_last_error(env);
60 }
61 
napi_get_global(napi_env env,napi_value * result)62 NAPI_EXTERN napi_status napi_get_global(napi_env env, napi_value* result)
63 {
64     CHECK_ENV(env);
65     CHECK_ARG(env, result);
66 
67     auto engine = reinterpret_cast<NativeEngine*>(env);
68     auto resultValue = engine->GetGlobal();
69 
70     *result = reinterpret_cast<napi_value>(resultValue);
71     return napi_clear_last_error(env);
72 }
73 
napi_get_boolean(napi_env env,bool value,napi_value * result)74 NAPI_EXTERN napi_status napi_get_boolean(napi_env env, bool value, napi_value* result)
75 {
76     CHECK_ENV(env);
77     CHECK_ARG(env, result);
78 
79     auto engine = reinterpret_cast<NativeEngine*>(env);
80     auto resultValue = engine->CreateBoolean(value);
81 
82     *result = reinterpret_cast<napi_value>(resultValue);
83     return napi_clear_last_error(env);
84 }
85 
86 // Methods to create Primitive types/Objects
napi_create_object(napi_env env,napi_value * result)87 NAPI_EXTERN napi_status napi_create_object(napi_env env, napi_value* result)
88 {
89     CHECK_ENV(env);
90     CHECK_ARG(env, result);
91 
92     auto engine = reinterpret_cast<NativeEngine*>(env);
93     auto resultValue = engine->CreateObject();
94 
95     *result = reinterpret_cast<napi_value>(resultValue);
96     return napi_clear_last_error(env);
97 }
98 
napi_create_array(napi_env env,napi_value * result)99 NAPI_EXTERN napi_status napi_create_array(napi_env env, napi_value* result)
100 {
101     CHECK_ENV(env);
102     CHECK_ARG(env, result);
103 
104     auto engine = reinterpret_cast<NativeEngine*>(env);
105     auto resultValue = engine->CreateArray(0);
106 
107     *result = reinterpret_cast<napi_value>(resultValue);
108     return napi_clear_last_error(env);
109 }
110 
napi_create_array_with_length(napi_env env,size_t length,napi_value * result)111 NAPI_EXTERN napi_status napi_create_array_with_length(napi_env env, size_t length, napi_value* result)
112 {
113     CHECK_ENV(env);
114     CHECK_ARG(env, result);
115 
116     auto engine = reinterpret_cast<NativeEngine*>(env);
117     auto resultValue = engine->CreateArray(length);
118 
119     *result = reinterpret_cast<napi_value>(resultValue);
120     return napi_clear_last_error(env);
121 }
122 
napi_create_double(napi_env env,double value,napi_value * result)123 NAPI_EXTERN napi_status napi_create_double(napi_env env, double value, napi_value* result)
124 {
125     CHECK_ENV(env);
126     CHECK_ARG(env, result);
127 
128     auto engine = reinterpret_cast<NativeEngine*>(env);
129     auto resultValue = engine->CreateNumber(value);
130 
131     *result = reinterpret_cast<napi_value>(resultValue);
132     return napi_clear_last_error(env);
133 }
134 
napi_create_int32(napi_env env,int32_t value,napi_value * result)135 NAPI_EXTERN napi_status napi_create_int32(napi_env env, int32_t value, napi_value* result)
136 {
137     CHECK_ENV(env);
138     CHECK_ARG(env, result);
139 
140     auto engine = reinterpret_cast<NativeEngine*>(env);
141     auto resultValue = engine->CreateNumber(value);
142 
143     *result = reinterpret_cast<napi_value>(resultValue);
144     return napi_clear_last_error(env);
145 }
146 
napi_create_uint32(napi_env env,uint32_t value,napi_value * result)147 NAPI_EXTERN napi_status napi_create_uint32(napi_env env, uint32_t value, napi_value* result)
148 {
149     CHECK_ENV(env);
150     CHECK_ARG(env, result);
151 
152     auto engine = reinterpret_cast<NativeEngine*>(env);
153     auto resultValue = engine->CreateNumber(value);
154 
155     *result = reinterpret_cast<napi_value>(resultValue);
156     return napi_clear_last_error(env);
157 }
158 
napi_create_int64(napi_env env,int64_t value,napi_value * result)159 NAPI_EXTERN napi_status napi_create_int64(napi_env env, int64_t value, napi_value* result)
160 {
161     CHECK_ENV(env);
162     CHECK_ARG(env, result);
163 
164     auto engine = reinterpret_cast<NativeEngine*>(env);
165     auto resultValue = engine->CreateNumber(value);
166 
167     *result = reinterpret_cast<napi_value>(resultValue);
168     return napi_clear_last_error(env);
169 }
170 
napi_create_string_latin1(napi_env env,const char * str,size_t length,napi_value * result)171 NAPI_EXTERN napi_status napi_create_string_latin1(napi_env env, const char* str, size_t length, napi_value* result)
172 {
173     CHECK_ENV(env);
174     CHECK_ARG(env, str);
175     CHECK_ARG(env, result);
176 
177     auto engine = reinterpret_cast<NativeEngine*>(env);
178     auto resultValue = engine->CreateString(str, (length == NAPI_AUTO_LENGTH) ? strlen(str) : length);
179 
180     *result = reinterpret_cast<napi_value>(resultValue);
181     return napi_clear_last_error(env);
182 }
183 
napi_create_string_utf8(napi_env env,const char * str,size_t length,napi_value * result)184 NAPI_EXTERN napi_status napi_create_string_utf8(napi_env env, const char* str, size_t length, napi_value* result)
185 {
186     CHECK_ENV(env);
187     CHECK_ARG(env, str);
188     CHECK_ARG(env, result);
189 
190     auto engine = reinterpret_cast<NativeEngine*>(env);
191     auto resultValue = engine->CreateString(str, (length == NAPI_AUTO_LENGTH) ? strlen(str) : length);
192 
193     *result = reinterpret_cast<napi_value>(resultValue);
194     return napi_clear_last_error(env);
195 }
196 
napi_create_string_utf16(napi_env env,const char16_t * str,size_t length,napi_value * result)197 NAPI_INNER_EXTERN napi_status napi_create_string_utf16(
198     napi_env env, const char16_t* str, size_t length, napi_value* result)
199 {
200     CHECK_ENV(env);
201     CHECK_ARG(env, str);
202     CHECK_ARG(env, result);
203     RETURN_STATUS_IF_FALSE(env, (length == NAPI_AUTO_LENGTH) || (length <= INT_MAX && length > 0), napi_invalid_arg);
204     auto engine = reinterpret_cast<NativeEngine*>(env);
205     int char16Length = static_cast<int>(std::char_traits<char16_t>::length(str));
206     auto resultValue = engine->CreateString16(str, (length == NAPI_AUTO_LENGTH) ? char16Length : length);
207 
208     *result = reinterpret_cast<napi_value>(resultValue);
209     return napi_clear_last_error(env);
210 }
211 
napi_create_symbol(napi_env env,napi_value description,napi_value * result)212 NAPI_EXTERN napi_status napi_create_symbol(napi_env env, napi_value description, napi_value* result)
213 {
214     CHECK_ENV(env);
215     CHECK_ARG(env, description);
216     CHECK_ARG(env, result);
217 
218     auto engine = reinterpret_cast<NativeEngine*>(env);
219     auto descriptionValue = reinterpret_cast<NativeValue*>(description);
220 
221     RETURN_STATUS_IF_FALSE(env, (descriptionValue->TypeOf() == NATIVE_STRING), napi_invalid_arg);
222 
223     auto resultValue = engine->CreateSymbol(descriptionValue);
224 
225     *result = reinterpret_cast<napi_value>(resultValue);
226     return napi_clear_last_error(env);
227 }
228 
napi_create_function(napi_env env,const char * utf8name,size_t length,napi_callback cb,void * data,napi_value * result)229 NAPI_EXTERN napi_status napi_create_function(napi_env env,
230                                              const char* utf8name,
231                                              size_t length,
232                                              napi_callback cb,
233                                              void* data,
234                                              napi_value* result)
235 {
236     CHECK_ENV(env);
237     CHECK_ARG(env, utf8name);
238     CHECK_ARG(env, cb);
239     CHECK_ARG(env, result);
240 
241     auto engine = reinterpret_cast<NativeEngine*>(env);
242     auto callback = reinterpret_cast<NativeCallback>(cb);
243 
244     auto resultValue =
245         engine->CreateFunction(utf8name, (length == NAPI_AUTO_LENGTH) ? strlen(utf8name) : length, callback, data);
246 
247     *result = reinterpret_cast<napi_value>(resultValue);
248     return napi_clear_last_error(env);
249 }
250 
napi_create_error(napi_env env,napi_value code,napi_value msg,napi_value * result)251 NAPI_EXTERN napi_status napi_create_error(napi_env env, napi_value code, napi_value msg, napi_value* result)
252 {
253     CHECK_ENV(env);
254     CHECK_ARG(env, msg);
255     CHECK_ARG(env, result);
256 
257     auto engine = reinterpret_cast<NativeEngine*>(env);
258     auto codeValue = reinterpret_cast<NativeValue*>(code);
259     auto msgValue = reinterpret_cast<NativeValue*>(msg);
260 
261     if (codeValue != nullptr) {
262         RETURN_STATUS_IF_FALSE(env, codeValue->TypeOf() == NATIVE_STRING, napi_invalid_arg);
263     }
264     RETURN_STATUS_IF_FALSE(env, msgValue->TypeOf() == NATIVE_STRING, napi_invalid_arg);
265 
266     auto resultValue = engine->CreateError(codeValue, msgValue);
267 
268     *result = reinterpret_cast<napi_value>(resultValue);
269     return napi_clear_last_error(env);
270 }
271 
napi_create_type_error(napi_env env,napi_value code,napi_value msg,napi_value * result)272 NAPI_EXTERN napi_status napi_create_type_error(napi_env env, napi_value code, napi_value msg, napi_value* result)
273 {
274     CHECK_ENV(env);
275     CHECK_ARG(env, msg);
276     CHECK_ARG(env, result);
277 
278     auto engine = reinterpret_cast<NativeEngine*>(env);
279     auto codeValue = reinterpret_cast<NativeValue*>(code);
280     auto msgValue = reinterpret_cast<NativeValue*>(msg);
281 
282     if (codeValue != nullptr) {
283         RETURN_STATUS_IF_FALSE(env, codeValue->TypeOf() == NATIVE_STRING, napi_invalid_arg);
284     }
285     RETURN_STATUS_IF_FALSE(env, msgValue->TypeOf() == NATIVE_STRING, napi_invalid_arg);
286 
287     auto resultValue = engine->CreateError(codeValue, msgValue);
288 
289     *result = reinterpret_cast<napi_value>(resultValue);
290     return napi_clear_last_error(env);
291 }
292 
napi_create_range_error(napi_env env,napi_value code,napi_value msg,napi_value * result)293 NAPI_EXTERN napi_status napi_create_range_error(napi_env env, napi_value code, napi_value msg, napi_value* result)
294 {
295     CHECK_ENV(env);
296     CHECK_ARG(env, msg);
297     CHECK_ARG(env, result);
298 
299     auto engine = reinterpret_cast<NativeEngine*>(env);
300     auto codeValue = reinterpret_cast<NativeValue*>(code);
301     auto msgValue = reinterpret_cast<NativeValue*>(msg);
302 
303     if (codeValue != nullptr) {
304         RETURN_STATUS_IF_FALSE(env, codeValue->TypeOf() == NATIVE_STRING, napi_invalid_arg);
305     }
306     RETURN_STATUS_IF_FALSE(env, msgValue->TypeOf() == NATIVE_STRING, napi_invalid_arg);
307 
308     auto resultValue = engine->CreateError(codeValue, msgValue);
309 
310     *result = reinterpret_cast<napi_value>(resultValue);
311     return napi_clear_last_error(env);
312 }
313 
314 // Methods to get the native napi_value from Primitive type
napi_typeof(napi_env env,napi_value value,napi_valuetype * result)315 NAPI_EXTERN napi_status napi_typeof(napi_env env, napi_value value, napi_valuetype* result)
316 {
317     CHECK_ENV(env);
318     CHECK_ARG(env, value);
319     CHECK_ARG(env, result);
320 
321     auto nativeValue = reinterpret_cast<NativeValue*>(value);
322 
323     *result = (napi_valuetype)nativeValue->TypeOf();
324     return napi_clear_last_error(env);
325 }
326 
napi_get_value_double(napi_env env,napi_value value,double * result)327 NAPI_EXTERN napi_status napi_get_value_double(napi_env env, napi_value value, double* result)
328 {
329     CHECK_ENV(env);
330     CHECK_ARG(env, value);
331     CHECK_ARG(env, result);
332 
333     auto nativeValue = reinterpret_cast<NativeValue*>(value);
334 
335     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_NUMBER, napi_number_expected);
336 
337     *result = *reinterpret_cast<NativeNumber*>(nativeValue->GetInterface(NativeNumber::INTERFACE_ID));
338     return napi_clear_last_error(env);
339 }
340 
napi_get_value_int32(napi_env env,napi_value value,int32_t * result)341 NAPI_EXTERN napi_status napi_get_value_int32(napi_env env, napi_value value, int32_t* result)
342 {
343     CHECK_ENV(env);
344     CHECK_ARG(env, value);
345     CHECK_ARG(env, result);
346 
347     auto nativeValue = reinterpret_cast<NativeValue*>(value);
348 
349     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_NUMBER, napi_number_expected);
350 
351     *result = *reinterpret_cast<NativeNumber*>(nativeValue->GetInterface(NativeNumber::INTERFACE_ID));
352     return napi_clear_last_error(env);
353 }
354 
napi_get_value_uint32(napi_env env,napi_value value,uint32_t * result)355 NAPI_EXTERN napi_status napi_get_value_uint32(napi_env env, napi_value value, uint32_t* result)
356 {
357     CHECK_ENV(env);
358     CHECK_ARG(env, value);
359     CHECK_ARG(env, result);
360 
361     auto nativeValue = reinterpret_cast<NativeValue*>(value);
362 
363     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_NUMBER, napi_number_expected);
364 
365     *result = *reinterpret_cast<NativeNumber*>(nativeValue->GetInterface(NativeNumber::INTERFACE_ID));
366     return napi_clear_last_error(env);
367 }
368 
napi_get_value_int64(napi_env env,napi_value value,int64_t * result)369 NAPI_EXTERN napi_status napi_get_value_int64(napi_env env, napi_value value, int64_t* result)
370 {
371     CHECK_ENV(env);
372     CHECK_ARG(env, value);
373     CHECK_ARG(env, result);
374 
375     auto nativeValue = reinterpret_cast<NativeValue*>(value);
376 
377     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_NUMBER, napi_number_expected);
378 
379     *result = *reinterpret_cast<NativeNumber*>(nativeValue->GetInterface(NativeNumber::INTERFACE_ID));
380     return napi_clear_last_error(env);
381 }
382 
napi_get_value_bool(napi_env env,napi_value value,bool * result)383 NAPI_EXTERN napi_status napi_get_value_bool(napi_env env, napi_value value, bool* result)
384 {
385     CHECK_ENV(env);
386     CHECK_ARG(env, value);
387     CHECK_ARG(env, result);
388 
389     auto nativeValue = reinterpret_cast<NativeValue*>(value);
390 
391     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_BOOLEAN, napi_boolean_expected);
392 
393     *result = *reinterpret_cast<NativeBoolean*>(nativeValue->GetInterface(NativeBoolean::INTERFACE_ID));
394     return napi_clear_last_error(env);
395 }
396 
397 // Copies LATIN-1 encoded bytes from a string into a buffer.
napi_get_value_string_latin1(napi_env env,napi_value value,char * buf,size_t bufsize,size_t * result)398 NAPI_EXTERN napi_status napi_get_value_string_latin1(
399     napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result)
400 {
401     CHECK_ENV(env);
402     CHECK_ARG(env, value);
403     CHECK_ARG(env, result);
404 
405     auto nativeValue = reinterpret_cast<NativeValue*>(value);
406 
407     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_STRING, napi_string_expected);
408 
409     auto nativeString = reinterpret_cast<NativeString*>(nativeValue->GetInterface(NativeString::INTERFACE_ID));
410 
411     nativeString->GetCString(buf, bufsize, result);
412     return napi_clear_last_error(env);
413 }
414 
415 // Copies UTF-8 encoded bytes from a string into a buffer.
napi_get_value_string_utf8(napi_env env,napi_value value,char * buf,size_t bufsize,size_t * result)416 NAPI_EXTERN napi_status napi_get_value_string_utf8(
417     napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result)
418 {
419     CHECK_ENV(env);
420     CHECK_ARG(env, value);
421     CHECK_ARG(env, result);
422 
423     auto nativeValue = reinterpret_cast<NativeValue*>(value);
424 
425     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_STRING, napi_string_expected);
426 
427     auto nativeString = reinterpret_cast<NativeString*>(nativeValue->GetInterface(NativeString::INTERFACE_ID));
428 
429     nativeString->GetCString(buf, bufsize, result);
430     return napi_clear_last_error(env);
431 }
432 
napi_get_value_string_utf16(napi_env env,napi_value value,char16_t * buf,size_t bufsize,size_t * result)433 NAPI_INNER_EXTERN napi_status napi_get_value_string_utf16(
434     napi_env env, napi_value value, char16_t* buf, size_t bufsize, size_t* result)
435 {
436     CHECK_ENV(env);
437     CHECK_ARG(env, value);
438     CHECK_ARG(env, result);
439 
440     auto nativeValue = reinterpret_cast<NativeValue*>(value);
441 
442     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_STRING, napi_string_expected);
443 
444     auto nativeString = reinterpret_cast<NativeString*>(nativeValue->GetInterface(NativeString::INTERFACE_ID));
445 
446     nativeString->GetCString16(buf, bufsize, result);
447     return napi_clear_last_error(env);
448 }
449 
450 // Methods to coerce values
451 // These APIs may execute user scripts
napi_coerce_to_bool(napi_env env,napi_value value,napi_value * result)452 NAPI_EXTERN napi_status napi_coerce_to_bool(napi_env env, napi_value value, napi_value* result)
453 {
454     CHECK_ENV(env);
455     CHECK_ARG(env, value);
456     CHECK_ARG(env, result);
457 
458     auto nativeValue = reinterpret_cast<NativeValue*>(value);
459 
460     auto resultValue = nativeValue->ToBoolean();
461 
462     *result = reinterpret_cast<napi_value>(resultValue);
463     return napi_clear_last_error(env);
464 }
465 
napi_coerce_to_number(napi_env env,napi_value value,napi_value * result)466 NAPI_EXTERN napi_status napi_coerce_to_number(napi_env env, napi_value value, napi_value* result)
467 {
468     CHECK_ENV(env);
469     CHECK_ARG(env, value);
470     CHECK_ARG(env, result);
471 
472     auto nativeValue = reinterpret_cast<NativeValue*>(value);
473 
474     auto resultValue = nativeValue->ToNumber();
475 
476     *result = reinterpret_cast<napi_value>(resultValue);
477     return napi_clear_last_error(env);
478 }
479 
napi_coerce_to_object(napi_env env,napi_value value,napi_value * result)480 NAPI_EXTERN napi_status napi_coerce_to_object(napi_env env, napi_value value, napi_value* result)
481 {
482     CHECK_ENV(env);
483     CHECK_ARG(env, value);
484     CHECK_ARG(env, result);
485 
486     auto nativeValue = reinterpret_cast<NativeValue*>(value);
487 
488     auto resultValue = nativeValue->ToObject();
489 
490     *result = reinterpret_cast<napi_value>(resultValue);
491     return napi_clear_last_error(env);
492 }
493 
napi_coerce_to_string(napi_env env,napi_value value,napi_value * result)494 NAPI_EXTERN napi_status napi_coerce_to_string(napi_env env, napi_value value, napi_value* result)
495 {
496     CHECK_ENV(env);
497     CHECK_ARG(env, value);
498     CHECK_ARG(env, result);
499 
500     auto nativeValue = reinterpret_cast<NativeValue*>(value);
501 
502     auto resultValue = nativeValue->ToString();
503 
504     *result = reinterpret_cast<napi_value>(resultValue);
505     return napi_clear_last_error(env);
506 }
507 
508 // Methods to work with Objects
napi_get_prototype(napi_env env,napi_value object,napi_value * result)509 NAPI_EXTERN napi_status napi_get_prototype(napi_env env, napi_value object, napi_value* result)
510 {
511     CHECK_ENV(env);
512     CHECK_ARG(env, object);
513     CHECK_ARG(env, result);
514 
515     auto nativeValue = reinterpret_cast<NativeValue*>(object);
516 
517     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_FUNCTION, napi_object_expected);
518 
519     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
520 
521     auto resultValue = nativeObject->GetPrototype();
522 
523     *result = reinterpret_cast<napi_value>(resultValue);
524     return napi_clear_last_error(env);
525 }
526 
napi_get_property_names(napi_env env,napi_value object,napi_value * result)527 NAPI_EXTERN napi_status napi_get_property_names(napi_env env, napi_value object, napi_value* result)
528 {
529     CHECK_ENV(env);
530     CHECK_ARG(env, object);
531     CHECK_ARG(env, result);
532 
533     auto nativeValue = reinterpret_cast<NativeValue*>(object);
534 
535     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
536         napi_object_expected);
537 
538     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
539 
540     auto resultValue = nativeObject->GetPropertyNames();
541 
542     *result = reinterpret_cast<napi_value>(resultValue);
543     return napi_clear_last_error(env);
544 }
545 
napi_set_property(napi_env env,napi_value object,napi_value key,napi_value value)546 NAPI_EXTERN napi_status napi_set_property(napi_env env, napi_value object, napi_value key, napi_value value)
547 {
548     CHECK_ENV(env);
549     CHECK_ARG(env, object);
550     CHECK_ARG(env, key);
551     CHECK_ARG(env, value);
552 
553     auto nativeValue = reinterpret_cast<NativeValue*>(object);
554     auto propKey = reinterpret_cast<NativeValue*>(key);
555     auto propValue = reinterpret_cast<NativeValue*>(value);
556 
557     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
558         napi_object_expected);
559 
560     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
561 
562     nativeObject->SetProperty(propKey, propValue);
563     return napi_clear_last_error(env);
564 }
565 
napi_has_property(napi_env env,napi_value object,napi_value key,bool * result)566 NAPI_EXTERN napi_status napi_has_property(napi_env env, napi_value object, napi_value key, bool* result)
567 {
568     CHECK_ENV(env);
569     CHECK_ARG(env, object);
570     CHECK_ARG(env, key);
571     CHECK_ARG(env, result);
572 
573     auto nativeValue = reinterpret_cast<NativeValue*>(object);
574     auto propKey = reinterpret_cast<NativeValue*>(key);
575 
576     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
577         napi_object_expected);
578 
579     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
580 
581     *result = nativeObject->HasProperty(propKey);
582     return napi_clear_last_error(env);
583 }
584 
napi_get_property(napi_env env,napi_value object,napi_value key,napi_value * result)585 NAPI_EXTERN napi_status napi_get_property(napi_env env, napi_value object, napi_value key, napi_value* result)
586 {
587     CHECK_ENV(env);
588     CHECK_ARG(env, object);
589     CHECK_ARG(env, key);
590     CHECK_ARG(env, result);
591 
592     auto nativeValue = reinterpret_cast<NativeValue*>(object);
593 
594     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
595         napi_object_expected);
596 
597     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
598 
599     auto resultValue = nativeObject->GetProperty((NativeValue*)key);
600 
601     *result = reinterpret_cast<napi_value>(resultValue);
602     return napi_clear_last_error(env);
603 }
604 
napi_delete_property(napi_env env,napi_value object,napi_value key,bool * result)605 NAPI_EXTERN napi_status napi_delete_property(napi_env env, napi_value object, napi_value key, bool* result)
606 {
607     CHECK_ENV(env);
608     CHECK_ARG(env, object);
609     CHECK_ARG(env, key);
610     CHECK_ARG(env, result);
611 
612     auto nativeValue = reinterpret_cast<NativeValue*>(object);
613     auto propKey = reinterpret_cast<NativeValue*>(key);
614 
615     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
616         napi_object_expected);
617 
618     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
619 
620     *result = nativeObject->DeleteProperty(propKey);
621     return napi_clear_last_error(env);
622 }
623 
napi_has_own_property(napi_env env,napi_value object,napi_value key,bool * result)624 NAPI_EXTERN napi_status napi_has_own_property(napi_env env, napi_value object, napi_value key, bool* result)
625 {
626     CHECK_ENV(env);
627     CHECK_ARG(env, object);
628     CHECK_ARG(env, key);
629     CHECK_ARG(env, result);
630 
631     auto nativeValue = reinterpret_cast<NativeValue*>(object);
632     auto propKey = reinterpret_cast<NativeValue*>(key);
633 
634     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
635         napi_object_expected);
636 
637     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
638 
639     *result = nativeObject->HasProperty(propKey);
640     return napi_clear_last_error(env);
641 }
642 
napi_set_named_property(napi_env env,napi_value object,const char * utf8name,napi_value value)643 NAPI_EXTERN napi_status napi_set_named_property(napi_env env, napi_value object, const char* utf8name, napi_value value)
644 {
645     CHECK_ENV(env);
646     CHECK_ARG(env, object);
647     CHECK_ARG(env, utf8name);
648     CHECK_ARG(env, value);
649 
650     auto nativeValue = reinterpret_cast<NativeValue*>(object);
651     auto propValue = reinterpret_cast<NativeValue*>(value);
652 
653     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
654         napi_object_expected);
655 
656     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
657 
658     nativeObject->SetProperty(utf8name, propValue);
659     return napi_clear_last_error(env);
660 }
661 
napi_has_named_property(napi_env env,napi_value object,const char * utf8name,bool * result)662 NAPI_EXTERN napi_status napi_has_named_property(napi_env env, napi_value object, const char* utf8name, bool* result)
663 {
664     CHECK_ENV(env);
665     CHECK_ARG(env, object);
666     CHECK_ARG(env, utf8name);
667     CHECK_ARG(env, result);
668 
669     auto nativeValue = reinterpret_cast<NativeValue*>(object);
670 
671     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
672         napi_object_expected);
673 
674     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
675 
676     *result = nativeObject->HasProperty(utf8name);
677     return napi_clear_last_error(env);
678 }
679 
napi_get_named_property(napi_env env,napi_value object,const char * utf8name,napi_value * result)680 NAPI_EXTERN napi_status napi_get_named_property(napi_env env,
681                                                 napi_value object,
682                                                 const char* utf8name,
683                                                 napi_value* result)
684 {
685     CHECK_ENV(env);
686     CHECK_ARG(env, object);
687     CHECK_ARG(env, utf8name);
688     CHECK_ARG(env, result);
689 
690     auto nativeValue = reinterpret_cast<NativeValue*>(object);
691 
692     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
693         napi_object_expected);
694 
695     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
696 
697     auto resultValue = nativeObject->GetProperty(utf8name);
698 
699     *result = reinterpret_cast<napi_value>(resultValue);
700     return napi_clear_last_error(env);
701 }
702 
napi_set_element(napi_env env,napi_value object,uint32_t index,napi_value value)703 NAPI_EXTERN napi_status napi_set_element(napi_env env, napi_value object, uint32_t index, napi_value value)
704 {
705     CHECK_ENV(env);
706     CHECK_ARG(env, object);
707     CHECK_ARG(env, value);
708 
709     auto nativeValue = reinterpret_cast<NativeValue*>(object);
710     auto elementValue = reinterpret_cast<NativeValue*>(value);
711 
712     RETURN_STATUS_IF_FALSE(env, nativeValue->IsArray(), napi_array_expected);
713 
714     auto nativeArray = reinterpret_cast<NativeArray*>(nativeValue->GetInterface(NativeArray::INTERFACE_ID));
715 
716     nativeArray->SetElement(index, elementValue);
717     return napi_clear_last_error(env);
718 }
719 
napi_has_element(napi_env env,napi_value object,uint32_t index,bool * result)720 NAPI_EXTERN napi_status napi_has_element(napi_env env, napi_value object, uint32_t index, bool* result)
721 {
722     CHECK_ENV(env);
723     CHECK_ARG(env, object);
724     CHECK_ARG(env, result);
725 
726     auto nativeValue = reinterpret_cast<NativeValue*>(object);
727 
728     RETURN_STATUS_IF_FALSE(env, nativeValue->IsArray(), napi_array_expected);
729 
730     auto nativeArray = reinterpret_cast<NativeArray*>(nativeValue->GetInterface(NativeArray::INTERFACE_ID));
731 
732     *result = nativeArray->HasElement(index);
733     return napi_clear_last_error(env);
734 }
735 
napi_get_element(napi_env env,napi_value object,uint32_t index,napi_value * result)736 NAPI_EXTERN napi_status napi_get_element(napi_env env, napi_value object, uint32_t index, napi_value* result)
737 {
738     CHECK_ENV(env);
739     CHECK_ARG(env, object);
740     CHECK_ARG(env, result);
741 
742     auto nativeValue = reinterpret_cast<NativeValue*>(object);
743 
744     RETURN_STATUS_IF_FALSE(env, nativeValue->IsArray(), napi_array_expected);
745 
746     auto nativeArray = reinterpret_cast<NativeArray*>(nativeValue->GetInterface(NativeArray::INTERFACE_ID));
747 
748     auto resultValue = nativeArray->GetElement(index);
749 
750     *result = reinterpret_cast<napi_value>(resultValue);
751     return napi_clear_last_error(env);
752 }
753 
napi_delete_element(napi_env env,napi_value object,uint32_t index,bool * result)754 NAPI_EXTERN napi_status napi_delete_element(napi_env env, napi_value object, uint32_t index, bool* result)
755 {
756     CHECK_ENV(env);
757     CHECK_ARG(env, object);
758     CHECK_ARG(env, result);
759 
760     auto nativeValue = reinterpret_cast<NativeValue*>(object);
761 
762     RETURN_STATUS_IF_FALSE(env, nativeValue->IsArray(), napi_array_expected);
763 
764     auto nativeArray = reinterpret_cast<NativeArray*>(nativeValue->GetInterface(NativeArray::INTERFACE_ID));
765 
766     *result = nativeArray->DeleteElement(index);
767     return napi_clear_last_error(env);
768 }
769 
napi_define_properties(napi_env env,napi_value object,size_t property_count,const napi_property_descriptor * properties)770 NAPI_EXTERN napi_status napi_define_properties(napi_env env,
771                                                napi_value object,
772                                                size_t property_count,
773                                                const napi_property_descriptor* properties)
774 {
775     CHECK_ENV(env);
776     CHECK_ARG(env, object);
777     CHECK_ARG(env, properties);
778 
779     auto nativeValue = reinterpret_cast<NativeValue*>(object);
780 
781     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
782 
783     NativeObject* nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
784 
785     for (size_t i = 0; i < property_count; i++) {
786         NativePropertyDescriptor property;
787 
788         property.utf8name = properties[i].utf8name;
789         property.name = reinterpret_cast<NativeValue*>(properties[i].name);
790         property.method = reinterpret_cast<NativeCallback>(properties[i].method);
791         property.getter = reinterpret_cast<NativeCallback>(properties[i].getter);
792         property.setter = reinterpret_cast<NativeCallback>(properties[i].setter);
793         property.value = reinterpret_cast<NativeValue*>(properties[i].value);
794         property.attributes = (uint32_t)properties[i].attributes;
795         property.data = properties[i].data;
796 
797         nativeObject->DefineProperty(property);
798     }
799 
800     return napi_clear_last_error(env);
801 }
802 
803 // Methods to work with Arrays
napi_is_array(napi_env env,napi_value value,bool * result)804 NAPI_EXTERN napi_status napi_is_array(napi_env env, napi_value value, bool* result)
805 {
806     CHECK_ENV(env);
807     CHECK_ARG(env, value);
808     CHECK_ARG(env, result);
809 
810     auto nativeValue = reinterpret_cast<NativeValue*>(value);
811 
812     *result = nativeValue->IsArray();
813     return napi_clear_last_error(env);
814 }
815 
napi_get_array_length(napi_env env,napi_value value,uint32_t * result)816 NAPI_EXTERN napi_status napi_get_array_length(napi_env env, napi_value value, uint32_t* result)
817 {
818     CHECK_ENV(env);
819     CHECK_ARG(env, value);
820     CHECK_ARG(env, result);
821 
822     auto nativeValue = reinterpret_cast<NativeValue*>(value);
823 
824     RETURN_STATUS_IF_FALSE(env, nativeValue->IsArray(), napi_array_expected);
825 
826     auto nativeArray = reinterpret_cast<NativeArray*>(nativeValue->GetInterface(NativeArray::INTERFACE_ID));
827 
828     *result = nativeArray->GetLength();
829 
830     return napi_clear_last_error(env);
831 }
832 
833 // Methods to compare values
napi_strict_equals(napi_env env,napi_value lhs,napi_value rhs,bool * result)834 NAPI_EXTERN napi_status napi_strict_equals(napi_env env, napi_value lhs, napi_value rhs, bool* result)
835 {
836     CHECK_ENV(env);
837     CHECK_ARG(env, lhs);
838     CHECK_ARG(env, rhs);
839     CHECK_ARG(env, result);
840 
841     auto nativeLhs = reinterpret_cast<NativeValue*>(lhs);
842     auto nativeRhs = reinterpret_cast<NativeValue*>(rhs);
843 
844     *result = nativeLhs->StrictEquals(nativeRhs);
845     return napi_clear_last_error(env);
846 }
847 
848 // Methods to work with Functions
napi_call_function(napi_env env,napi_value recv,napi_value func,size_t argc,const napi_value * argv,napi_value * result)849 NAPI_EXTERN napi_status napi_call_function(napi_env env,
850                                            napi_value recv,
851                                            napi_value func,
852                                            size_t argc,
853                                            const napi_value* argv,
854                                            napi_value* result)
855 {
856     CHECK_ENV(env);
857     CHECK_ARG(env, func);
858     if (argc > 0) {
859         CHECK_ARG(env, argv);
860     }
861     CHECK_ARG(env, result);
862 
863     auto engine = reinterpret_cast<NativeEngine*>(env);
864     auto nativeRecv = reinterpret_cast<NativeValue*>(recv);
865     auto nativeFunc = reinterpret_cast<NativeValue*>(func);
866     auto nativeArgv = reinterpret_cast<NativeValue* const*>(argv);
867 
868     RETURN_STATUS_IF_FALSE(env, nativeFunc->TypeOf() == NATIVE_FUNCTION, napi_function_expected);
869 
870     HILOG_INFO("engine: %{public}p, nativeRecv: %{public}p, nativeFunc: %{public}p, nativeArgv: %{public}p",
871         engine, nativeRecv, nativeFunc, nativeArgv);
872 
873     auto resultValue = engine->CallFunction(nativeRecv, nativeFunc, nativeArgv, argc);
874 
875     HILOG_INFO("engine: %{public}p, nativeRecv: %{public}p, nativeFunc: %{public}p, nativeArgv: %{public}p, "
876         "resultValue: %{public}p", engine, nativeRecv, nativeFunc, nativeArgv, resultValue);
877 
878     *result = reinterpret_cast<napi_value>(resultValue);
879     return napi_clear_last_error(env);
880 }
881 
napi_new_instance(napi_env env,napi_value constructor,size_t argc,const napi_value * argv,napi_value * result)882 NAPI_EXTERN napi_status napi_new_instance(
883     napi_env env, napi_value constructor, size_t argc, const napi_value* argv, napi_value* result)
884 {
885     CHECK_ENV(env);
886     CHECK_ARG(env, constructor);
887     if (argc > 0) {
888         CHECK_ARG(env, argv);
889     }
890     CHECK_ARG(env, result);
891 
892     auto engine = reinterpret_cast<NativeEngine*>(env);
893     auto nativeConstructor = reinterpret_cast<NativeValue*>(constructor);
894     auto nativeArgv = reinterpret_cast<NativeValue* const*>(argv);
895 
896     RETURN_STATUS_IF_FALSE(env, nativeConstructor->TypeOf() == NATIVE_FUNCTION, napi_function_expected);
897 
898     auto resultValue = engine->CreateInstance(nativeConstructor, nativeArgv, argc);
899 
900     *result = reinterpret_cast<napi_value>(resultValue);
901     return napi_clear_last_error(env);
902 }
903 
napi_instanceof(napi_env env,napi_value object,napi_value constructor,bool * result)904 NAPI_EXTERN napi_status napi_instanceof(napi_env env, napi_value object, napi_value constructor, bool* result)
905 {
906     CHECK_ENV(env);
907     CHECK_ARG(env, object);
908     CHECK_ARG(env, constructor);
909     CHECK_ARG(env, result);
910 
911     auto nativeValue = reinterpret_cast<NativeValue*>(object);
912     auto nativeConstructor = reinterpret_cast<NativeValue*>(constructor);
913 
914     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
915 
916     RETURN_STATUS_IF_FALSE(env, nativeConstructor->TypeOf() == NATIVE_FUNCTION, napi_function_expected);
917 
918     *result = nativeValue->InstanceOf(nativeConstructor);
919     return napi_clear_last_error(env);
920 }
921 
922 // Methods to work with napi_callbacks
923 // Gets all callback info in a single call. (Ugly, but faster.)
napi_get_cb_info(napi_env env,napi_callback_info cbinfo,size_t * argc,napi_value * argv,napi_value * this_arg,void ** data)924 NAPI_EXTERN napi_status napi_get_cb_info(napi_env env,              // [in] NAPI environment handle
925                                          napi_callback_info cbinfo, // [in] Opaque callback-info handle
926                                          size_t* argc,         // [in-out] Specifies the size of the provided argv array
927                                                                // and receives the actual count of args.
928                                          napi_value* argv,     // [out] Array of values
929                                          napi_value* this_arg, // [out] Receives the JS 'this' arg for the call
930                                          void** data)          // [out] Receives the data pointer for the callback.
931 {
932     CHECK_ENV(env);
933     CHECK_ARG(env, cbinfo);
934 
935     auto info = reinterpret_cast<NativeCallbackInfo*>(cbinfo);
936 
937     if ((argc != nullptr) && (argv != nullptr)) {
938         size_t i = 0;
939         for (i = 0; (i < *argc) && (i < info->argc); i++) {
940             argv[i] = reinterpret_cast<napi_value>(info->argv[i]);
941         }
942         *argc = i;
943     }
944 
945     if (argc != nullptr) {
946         *argc = info->argc;
947     }
948 
949     if (this_arg != nullptr) {
950         *this_arg = reinterpret_cast<napi_value>(info->thisVar);
951     }
952 
953     if (data != nullptr && info->functionInfo != nullptr) {
954         *data = info->functionInfo->data;
955     }
956 
957     return napi_clear_last_error(env);
958 }
959 
napi_get_new_target(napi_env env,napi_callback_info cbinfo,napi_value * result)960 NAPI_EXTERN napi_status napi_get_new_target(napi_env env, napi_callback_info cbinfo, napi_value* result)
961 {
962     CHECK_ENV(env);
963     CHECK_ARG(env, cbinfo);
964     CHECK_ARG(env, result);
965 
966     auto info = reinterpret_cast<NativeCallbackInfo*>(cbinfo);
967 
968     if (info->thisVar->InstanceOf(info->function)) {
969         *result = reinterpret_cast<napi_value>(info->function);
970     } else {
971         *result = nullptr;
972     }
973 
974     return napi_clear_last_error(env);
975 }
976 
napi_define_class(napi_env env,const char * utf8name,size_t length,napi_callback constructor,void * data,size_t property_count,const napi_property_descriptor * properties,napi_value * result)977 NAPI_EXTERN napi_status napi_define_class(napi_env env,
978                                           const char* utf8name,
979                                           size_t length,
980                                           napi_callback constructor,
981                                           void* data,
982                                           size_t property_count,
983                                           const napi_property_descriptor* properties,
984                                           napi_value* result)
985 {
986     CHECK_ENV(env);
987     CHECK_ARG(env, utf8name);
988     CHECK_ARG(env, constructor);
989     if (property_count > 0) {
990         CHECK_ARG(env, properties);
991     }
992     CHECK_ARG(env, result);
993 
994     auto engine = reinterpret_cast<NativeEngine*>(env);
995     auto callback = reinterpret_cast<NativeCallback>(constructor);
996     auto nativeProperties = reinterpret_cast<const NativePropertyDescriptor*>(properties);
997 
998     auto resultValue = engine->DefineClass(utf8name, callback, data, nativeProperties, property_count);
999 
1000     *result = reinterpret_cast<napi_value>(resultValue);
1001 
1002     return napi_clear_last_error(env);
1003 }
1004 
1005 // Methods to work with external data objects
napi_wrap(napi_env env,napi_value js_object,void * native_object,napi_finalize finalize_cb,void * finalize_hint,napi_ref * result)1006 NAPI_EXTERN napi_status napi_wrap(napi_env env,
1007                                   napi_value js_object,
1008                                   void* native_object,
1009                                   napi_finalize finalize_cb,
1010                                   void* finalize_hint,
1011                                   napi_ref* result)
1012 {
1013     CHECK_ENV(env);
1014     CHECK_ARG(env, js_object);
1015     CHECK_ARG(env, native_object);
1016     CHECK_ARG(env, finalize_cb);
1017 
1018     auto nativeValue = reinterpret_cast<NativeValue*>(js_object);
1019     auto callback = reinterpret_cast<NativeFinalize>(finalize_cb);
1020 
1021     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
1022 
1023     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
1024 
1025     nativeObject->SetNativePointer(native_object, callback, finalize_hint);
1026     return napi_clear_last_error(env);
1027 }
1028 
napi_unwrap(napi_env env,napi_value js_object,void ** result)1029 NAPI_EXTERN napi_status napi_unwrap(napi_env env, napi_value js_object, void** result)
1030 {
1031     CHECK_ENV(env);
1032     CHECK_ARG(env, js_object);
1033     CHECK_ARG(env, result);
1034 
1035     auto nativeValue = reinterpret_cast<NativeValue*>(js_object);
1036 
1037     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
1038 
1039     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
1040 
1041     *result = nativeObject->GetNativePointer();
1042 
1043     return napi_clear_last_error(env);
1044 }
1045 
napi_remove_wrap(napi_env env,napi_value js_object,void ** result)1046 NAPI_EXTERN napi_status napi_remove_wrap(napi_env env, napi_value js_object, void** result)
1047 {
1048     CHECK_ENV(env);
1049     CHECK_ARG(env, js_object);
1050     CHECK_ARG(env, result);
1051 
1052     auto nativeValue = reinterpret_cast<NativeValue*>(js_object);
1053 
1054     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
1055 
1056     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
1057 
1058     *result = nativeObject->GetNativePointer();
1059     nativeObject->SetNativePointer(nullptr, nullptr, nullptr);
1060 
1061     return napi_clear_last_error(env);
1062 }
1063 
napi_create_external(napi_env env,void * data,napi_finalize finalize_cb,void * finalize_hint,napi_value * result)1064 NAPI_EXTERN napi_status napi_create_external(
1065     napi_env env, void* data, napi_finalize finalize_cb, void* finalize_hint, napi_value* result)
1066 {
1067     CHECK_ENV(env);
1068     CHECK_ARG(env, data);
1069     CHECK_ARG(env, finalize_cb);
1070     CHECK_ARG(env, result);
1071 
1072     auto engine = reinterpret_cast<NativeEngine*>(env);
1073     auto callback = reinterpret_cast<NativeFinalize>(finalize_cb);
1074 
1075     auto resultValue = engine->CreateExternal(data, callback, finalize_hint);
1076 
1077     *result = reinterpret_cast<napi_value>(resultValue);
1078     return napi_clear_last_error(env);
1079 }
1080 
napi_get_value_external(napi_env env,napi_value value,void ** result)1081 NAPI_EXTERN napi_status napi_get_value_external(napi_env env, napi_value value, void** result)
1082 {
1083     CHECK_ENV(env);
1084     CHECK_ARG(env, value);
1085     CHECK_ARG(env, result);
1086 
1087     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1088 
1089     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_EXTERNAL, napi_object_expected);
1090 
1091     auto external = reinterpret_cast<NativeExternal*>(nativeValue->GetInterface(NativeExternal::INTERFACE_ID));
1092 
1093     *result = *external;
1094     return napi_clear_last_error(env);
1095 }
1096 
1097 // Methods to control object lifespan
1098 // Set initial_refcount to 0 for a weak reference, >0 for a strong reference.
napi_create_reference(napi_env env,napi_value value,uint32_t initial_refcount,napi_ref * result)1099 NAPI_EXTERN napi_status napi_create_reference(napi_env env,
1100                                               napi_value value,
1101                                               uint32_t initial_refcount,
1102                                               napi_ref* result)
1103 {
1104     CHECK_ENV(env);
1105     CHECK_ARG(env, value);
1106     CHECK_ARG(env, result);
1107 
1108     auto engine = reinterpret_cast<NativeEngine*>(env);
1109     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1110 
1111     auto reference = engine->CreateReference(nativeValue, initial_refcount);
1112 
1113     *result = reinterpret_cast<napi_ref>(reference);
1114     return napi_clear_last_error(env);
1115 }
1116 
1117 // Deletes a reference. The referenced value is released, and may
1118 // be GC'd unless there are other references to it.
napi_delete_reference(napi_env env,napi_ref ref)1119 NAPI_EXTERN napi_status napi_delete_reference(napi_env env, napi_ref ref)
1120 {
1121     CHECK_ENV(env);
1122     CHECK_ARG(env, ref);
1123 
1124     auto reference = reinterpret_cast<NativeReference*>(ref);
1125 
1126     delete reference;
1127     reference = nullptr;
1128 
1129     return napi_clear_last_error(env);
1130 }
1131 
1132 // Increments the reference count, optionally returning the resulting count.
1133 // After this call the  reference will be a strong reference because its
1134 // refcount is >0, and the referenced object is effectively "pinned".
1135 // Calling this when the refcount is 0 and the object is unavailable
1136 // results in an error.
napi_reference_ref(napi_env env,napi_ref ref,uint32_t * result)1137 NAPI_EXTERN napi_status napi_reference_ref(napi_env env, napi_ref ref, uint32_t* result)
1138 {
1139     CHECK_ENV(env);
1140     CHECK_ARG(env, ref);
1141     CHECK_ARG(env, result);
1142 
1143     auto reference = reinterpret_cast<NativeReference*>(ref);
1144 
1145     *result = reference->Ref();
1146 
1147     return napi_clear_last_error(env);
1148 }
1149 
1150 // Decrements the reference count, optionally returning the resulting count.
1151 // If the result is 0 the reference is now weak and the object may be GC'd
1152 // at any time if there are no other references. Calling this when the
1153 // refcount is already 0 results in an error.
napi_reference_unref(napi_env env,napi_ref ref,uint32_t * result)1154 NAPI_EXTERN napi_status napi_reference_unref(napi_env env, napi_ref ref, uint32_t* result)
1155 {
1156     CHECK_ENV(env);
1157     CHECK_ARG(env, ref);
1158     CHECK_ARG(env, result);
1159 
1160     auto reference = reinterpret_cast<NativeReference*>(ref);
1161 
1162     *result = reference->Unref();
1163 
1164     return napi_clear_last_error(env);
1165 }
1166 
1167 // Attempts to get a referenced value. If the reference is weak,
1168 // the value might no longer be available, in that case the call
1169 // is still successful but the result is nullptr.
napi_get_reference_value(napi_env env,napi_ref ref,napi_value * result)1170 NAPI_EXTERN napi_status napi_get_reference_value(napi_env env, napi_ref ref, napi_value* result)
1171 {
1172     CHECK_ENV(env);
1173     CHECK_ARG(env, ref);
1174     CHECK_ARG(env, result);
1175 
1176     auto reference = reinterpret_cast<NativeReference*>(ref);
1177 
1178     auto resultValue = reference->Get();
1179 
1180     *result = reinterpret_cast<napi_value>(resultValue);
1181     return napi_clear_last_error(env);
1182 }
1183 
napi_open_handle_scope(napi_env env,napi_handle_scope * result)1184 NAPI_EXTERN napi_status napi_open_handle_scope(napi_env env, napi_handle_scope* result)
1185 {
1186     CHECK_ENV(env);
1187     CHECK_ARG(env, result);
1188 
1189     auto engine = reinterpret_cast<NativeEngine*>(env);
1190 
1191     auto scopeManager = engine->GetScopeManager();
1192     if (scopeManager == nullptr) {
1193         return napi_set_last_error(env, napi_generic_failure);
1194     }
1195     *result = reinterpret_cast<napi_handle_scope>(scopeManager->Open());
1196     return napi_clear_last_error(env);
1197 }
1198 
napi_close_handle_scope(napi_env env,napi_handle_scope scope)1199 NAPI_EXTERN napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope)
1200 {
1201     CHECK_ENV(env);
1202     CHECK_ARG(env, scope);
1203 
1204     auto engine = reinterpret_cast<NativeEngine*>(env);
1205     auto nativeScope = reinterpret_cast<NativeScope*>(scope);
1206 
1207     auto scopeManager = engine->GetScopeManager();
1208     if (scopeManager == nullptr) {
1209         return napi_set_last_error(env, napi_generic_failure);
1210     }
1211     scopeManager->Close(nativeScope);
1212     return napi_clear_last_error(env);
1213 }
1214 
napi_open_escapable_handle_scope(napi_env env,napi_escapable_handle_scope * result)1215 NAPI_EXTERN napi_status napi_open_escapable_handle_scope(napi_env env, napi_escapable_handle_scope* result)
1216 {
1217     CHECK_ENV(env);
1218     CHECK_ARG(env, result);
1219 
1220     auto engine = reinterpret_cast<NativeEngine*>(env);
1221     auto scopeManager = engine->GetScopeManager();
1222 
1223     if (scopeManager == nullptr) {
1224         return napi_set_last_error(env, napi_generic_failure);
1225     }
1226 
1227     auto NativeScope = scopeManager->OpenEscape();
1228 
1229     *result = reinterpret_cast<napi_escapable_handle_scope>(NativeScope);
1230     return napi_clear_last_error(env);
1231 }
1232 
napi_close_escapable_handle_scope(napi_env env,napi_escapable_handle_scope scope)1233 NAPI_EXTERN napi_status napi_close_escapable_handle_scope(napi_env env, napi_escapable_handle_scope scope)
1234 {
1235     CHECK_ENV(env);
1236     CHECK_ARG(env, scope);
1237 
1238     auto engine = reinterpret_cast<NativeEngine*>(env);
1239     auto nativeScope = reinterpret_cast<NativeScope*>(scope);
1240 
1241     auto scopeManager = engine->GetScopeManager();
1242     if (scopeManager == nullptr) {
1243         return napi_set_last_error(env, napi_generic_failure);
1244     }
1245     scopeManager->CloseEscape(nativeScope);
1246     return napi_clear_last_error(env);
1247 }
1248 
napi_escape_handle(napi_env env,napi_escapable_handle_scope scope,napi_value escapee,napi_value * result)1249 NAPI_EXTERN napi_status napi_escape_handle(napi_env env,
1250                                            napi_escapable_handle_scope scope,
1251                                            napi_value escapee,
1252                                            napi_value* result)
1253 {
1254     CHECK_ENV(env);
1255     CHECK_ARG(env, scope);
1256     CHECK_ARG(env, escapee);
1257     CHECK_ARG(env, result);
1258 
1259     auto engine = reinterpret_cast<NativeEngine*>(env);
1260     auto nativeScope = reinterpret_cast<NativeScope*>(scope);
1261     auto escapeeValue = reinterpret_cast<NativeValue*>(escapee);
1262 
1263     auto scopeManager = engine->GetScopeManager();
1264     if (scopeManager == nullptr) {
1265         return napi_set_last_error(env, napi_generic_failure);
1266     }
1267 
1268     auto resultValue = scopeManager->Escape(nativeScope, escapeeValue);
1269 
1270     *result = reinterpret_cast<napi_value>(resultValue);
1271     return napi_clear_last_error(env);
1272 }
1273 
1274 // Methods to support error handling
napi_throw(napi_env env,napi_value error)1275 NAPI_EXTERN napi_status napi_throw(napi_env env, napi_value error)
1276 {
1277     CHECK_ENV(env);
1278     CHECK_ARG(env, error);
1279 
1280     auto engine = reinterpret_cast<NativeEngine*>(env);
1281     auto nativeValue = reinterpret_cast<NativeValue*>(error);
1282 
1283     RETURN_STATUS_IF_FALSE(env, nativeValue->IsError(), napi_invalid_arg);
1284 
1285     engine->Throw(nativeValue);
1286     return napi_clear_last_error(env);
1287 }
1288 
napi_throw_error(napi_env env,const char * code,const char * msg)1289 NAPI_EXTERN napi_status napi_throw_error(napi_env env, const char* code, const char* msg)
1290 {
1291     CHECK_ENV(env);
1292     CHECK_ARG(env, msg);
1293 
1294     auto engine = reinterpret_cast<NativeEngine*>(env);
1295 
1296     engine->Throw(NativeErrorType::NATIVE_COMMON_ERROR, code, msg);
1297     return napi_clear_last_error(env);
1298 }
1299 
napi_throw_type_error(napi_env env,const char * code,const char * msg)1300 NAPI_EXTERN napi_status napi_throw_type_error(napi_env env, const char* code, const char* msg)
1301 {
1302     CHECK_ENV(env);
1303     CHECK_ARG(env, msg);
1304 
1305     auto engine = reinterpret_cast<NativeEngine*>(env);
1306 
1307     engine->Throw(NativeErrorType::NATIVE_TYPE_ERROR, code, msg);
1308     return napi_generic_failure;
1309 }
1310 
napi_throw_range_error(napi_env env,const char * code,const char * msg)1311 NAPI_EXTERN napi_status napi_throw_range_error(napi_env env, const char* code, const char* msg)
1312 {
1313     CHECK_ENV(env);
1314     CHECK_ARG(env, msg);
1315 
1316     auto engine = reinterpret_cast<NativeEngine*>(env);
1317 
1318     engine->Throw(NativeErrorType::NATIVE_RANGE_ERROR, code, msg);
1319     return napi_generic_failure;
1320 }
1321 
napi_is_error(napi_env env,napi_value value,bool * result)1322 NAPI_EXTERN napi_status napi_is_error(napi_env env, napi_value value, bool* result)
1323 {
1324     CHECK_ENV(env);
1325     CHECK_ARG(env, value);
1326     CHECK_ARG(env, result);
1327 
1328     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1329 
1330     *result = nativeValue->IsError();
1331     return napi_clear_last_error(env);
1332 }
1333 
1334 // Methods to support catching exceptions
napi_is_exception_pending(napi_env env,bool * result)1335 NAPI_EXTERN napi_status napi_is_exception_pending(napi_env env, bool* result)
1336 {
1337     CHECK_ENV(env);
1338     CHECK_ARG(env, result);
1339 
1340     auto engine = reinterpret_cast<NativeEngine*>(env);
1341 
1342     *result = engine->IsExceptionPending();
1343     return napi_clear_last_error(env);
1344 }
1345 
napi_get_and_clear_last_exception(napi_env env,napi_value * result)1346 NAPI_EXTERN napi_status napi_get_and_clear_last_exception(napi_env env, napi_value* result)
1347 {
1348     CHECK_ENV(env);
1349     CHECK_ARG(env, result);
1350 
1351     auto engine = reinterpret_cast<NativeEngine*>(env);
1352 
1353     auto resultValue = engine->GetAndClearLastException();
1354 
1355     *result = reinterpret_cast<napi_value>(resultValue);
1356     return napi_clear_last_error(env);
1357 }
1358 
1359 // Methods to work with array buffers and typed arrays
napi_is_arraybuffer(napi_env env,napi_value value,bool * result)1360 NAPI_EXTERN napi_status napi_is_arraybuffer(napi_env env, napi_value value, bool* result)
1361 {
1362     CHECK_ENV(env);
1363     CHECK_ARG(env, value);
1364     CHECK_ARG(env, result);
1365 
1366     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1367 
1368     *result = nativeValue->IsArrayBuffer();
1369     return napi_clear_last_error(env);
1370 }
1371 
napi_create_arraybuffer(napi_env env,size_t byte_length,void ** data,napi_value * result)1372 NAPI_EXTERN napi_status napi_create_arraybuffer(napi_env env, size_t byte_length, void** data, napi_value* result)
1373 {
1374     CHECK_ENV(env);
1375     CHECK_ARG(env, data);
1376     CHECK_ARG(env, result);
1377 
1378     auto engine = reinterpret_cast<NativeEngine*>(env);
1379 
1380     auto resultValue = engine->CreateArrayBuffer(data, byte_length);
1381 
1382     *result = reinterpret_cast<napi_value>(resultValue);
1383     return napi_clear_last_error(env);
1384 }
1385 
napi_create_external_arraybuffer(napi_env env,void * external_data,size_t byte_length,napi_finalize finalize_cb,void * finalize_hint,napi_value * result)1386 NAPI_EXTERN napi_status napi_create_external_arraybuffer(napi_env env,
1387                                                          void* external_data,
1388                                                          size_t byte_length,
1389                                                          napi_finalize finalize_cb,
1390                                                          void* finalize_hint,
1391                                                          napi_value* result)
1392 {
1393     CHECK_ENV(env);
1394     CHECK_ARG(env, external_data);
1395     CHECK_ARG(env, finalize_cb);
1396     CHECK_ARG(env, result);
1397 
1398     auto engine = reinterpret_cast<NativeEngine*>(env);
1399     auto callback = reinterpret_cast<NativeFinalize>(finalize_cb);
1400 
1401     auto resultValue = engine->CreateArrayBufferExternal(external_data, byte_length, callback, finalize_hint);
1402 
1403     *result = reinterpret_cast<napi_value>(resultValue);
1404     return napi_clear_last_error(env);
1405 }
1406 
napi_get_arraybuffer_info(napi_env env,napi_value arraybuffer,void ** data,size_t * byte_length)1407 NAPI_EXTERN napi_status napi_get_arraybuffer_info(napi_env env,
1408                                                   napi_value arraybuffer,
1409                                                   void** data,
1410                                                   size_t* byte_length)
1411 {
1412     CHECK_ENV(env);
1413     CHECK_ARG(env, arraybuffer);
1414     CHECK_ARG(env, data);
1415     CHECK_ARG(env, byte_length);
1416 
1417     auto nativeValue = reinterpret_cast<NativeValue*>(arraybuffer);
1418 
1419     RETURN_STATUS_IF_FALSE(env, nativeValue->IsArrayBuffer(), napi_status::napi_arraybuffer_expected);
1420 
1421     auto nativeArrayBuffer =
1422         reinterpret_cast<NativeArrayBuffer*>(nativeValue->GetInterface(NativeArrayBuffer::INTERFACE_ID));
1423 
1424     *data = nativeArrayBuffer->GetBuffer();
1425     *byte_length = nativeArrayBuffer->GetLength();
1426     return napi_clear_last_error(env);
1427 }
1428 
napi_is_typedarray(napi_env env,napi_value value,bool * result)1429 NAPI_EXTERN napi_status napi_is_typedarray(napi_env env, napi_value value, bool* result)
1430 {
1431     CHECK_ENV(env);
1432     CHECK_ARG(env, value);
1433 
1434     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1435 
1436     *result = nativeValue->IsTypedArray();
1437 
1438     return napi_clear_last_error(env);
1439 }
1440 
1441 EXTERN_C_START
napi_is_buffer(napi_env env,napi_value value,bool * result)1442 NAPI_INNER_EXTERN napi_status napi_is_buffer(napi_env env, napi_value value, bool* result)
1443 {
1444     CHECK_ENV(env);
1445     CHECK_ARG(env, value);
1446     CHECK_ARG(env, result);
1447 
1448     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1449     *result = nativeValue->IsBuffer();
1450     return napi_clear_last_error(env);
1451 }
1452 
napi_create_buffer(napi_env env,size_t size,void ** data,napi_value * result)1453 NAPI_INNER_EXTERN napi_status napi_create_buffer(napi_env env, size_t size, void** data, napi_value* result)
1454 {
1455     CHECK_ENV(env);
1456     CHECK_ARG(env, data);
1457     CHECK_ARG(env, result);
1458 
1459     RETURN_STATUS_IF_FALSE(env, size > 0, napi_invalid_arg);
1460 
1461     auto engine = reinterpret_cast<NativeEngine*>(env);
1462 
1463     auto resultValue = engine->CreateBuffer(data, size);
1464 
1465     CHECK_ARG(env, resultValue);
1466     CHECK_ARG(env, *data);
1467 
1468     auto nativeBuffer = reinterpret_cast<NativeBuffer*>(resultValue->GetInterface(NativeBuffer::INTERFACE_ID));
1469     void* ptr = nativeBuffer->GetBuffer();
1470     CHECK_ARG(env, ptr);
1471 
1472     *result = reinterpret_cast<napi_value>(resultValue);
1473     return napi_clear_last_error(env);
1474 }
1475 
napi_create_buffer_copy(napi_env env,size_t length,const void * data,void ** result_data,napi_value * result)1476 NAPI_INNER_EXTERN napi_status napi_create_buffer_copy(
1477     napi_env env, size_t length, const void* data, void** result_data, napi_value* result)
1478 {
1479     CHECK_ENV(env);
1480     CHECK_ARG(env, data);
1481     CHECK_ARG(env, result_data);
1482     CHECK_ARG(env, result);
1483     RETURN_STATUS_IF_FALSE(env, length > 0, napi_invalid_arg);
1484 
1485     auto engine = reinterpret_cast<NativeEngine*>(env);
1486     auto resultValue = engine->CreateBufferCopy(result_data, length, data);
1487     if (resultValue == nullptr) {
1488         HILOG_INFO("engine create buffer_copy failed!");
1489     }
1490     CHECK_ARG(env, resultValue);
1491 
1492     auto nativeBuffer = reinterpret_cast<NativeBuffer*>(resultValue->GetInterface(NativeBuffer::INTERFACE_ID));
1493     void* ptr = nativeBuffer->GetBuffer();
1494     CHECK_ARG(env, ptr);
1495 
1496     *result = reinterpret_cast<napi_value>(resultValue);
1497     return napi_clear_last_error(env);
1498 }
1499 
napi_create_external_buffer(napi_env env,size_t length,void * data,napi_finalize finalize_cb,void * finalize_hint,napi_value * result)1500 NAPI_INNER_EXTERN napi_status napi_create_external_buffer(
1501     napi_env env, size_t length, void* data, napi_finalize finalize_cb, void* finalize_hint, napi_value* result)
1502 {
1503     CHECK_ENV(env);
1504     CHECK_ARG(env, result);
1505     CHECK_ARG(env, data);
1506     RETURN_STATUS_IF_FALSE(env, length > 0, napi_invalid_arg);
1507 
1508     auto engine = reinterpret_cast<NativeEngine*>(env);
1509     auto callback = reinterpret_cast<NativeFinalize>(finalize_cb);
1510     auto resultValue = engine->CreateBufferExternal(data, length, callback, finalize_hint);
1511     CHECK_ARG(env, resultValue);
1512 
1513     auto nativeBuffer = reinterpret_cast<NativeBuffer*>(resultValue->GetInterface(NativeBuffer::INTERFACE_ID));
1514     void* ptr = nativeBuffer->GetBuffer();
1515     CHECK_ARG(env, ptr);
1516 
1517     *result = reinterpret_cast<napi_value>(resultValue);
1518     return napi_clear_last_error(env);
1519 }
1520 
napi_get_buffer_info(napi_env env,napi_value value,void ** data,size_t * length)1521 NAPI_INNER_EXTERN napi_status napi_get_buffer_info(napi_env env, napi_value value, void** data, size_t* length)
1522 {
1523     CHECK_ENV(env);
1524     CHECK_ARG(env, value);
1525 
1526     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1527     RETURN_STATUS_IF_FALSE(env, nativeValue->IsBuffer(), napi_status::napi_arraybuffer_expected);
1528 
1529     auto nativeBuffer = reinterpret_cast<NativeBuffer*>(nativeValue->GetInterface(NativeBuffer::INTERFACE_ID));
1530     if (data != nullptr) {
1531         *data = nativeBuffer->GetBuffer();
1532     }
1533     if (length != nullptr) {
1534         *length = nativeBuffer->GetLength();
1535     }
1536     return napi_clear_last_error(env);
1537 }
1538 
napi_object_freeze(napi_env env,napi_value object)1539 NAPI_EXTERN napi_status napi_object_freeze(napi_env env, napi_value object)
1540 {
1541     CHECK_ENV(env);
1542     CHECK_ARG(env, object);
1543 
1544     auto nativeValue = reinterpret_cast<NativeValue*>(object);
1545     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
1546     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
1547 
1548     nativeObject->Freeze();
1549 
1550     return napi_clear_last_error(env);
1551 }
1552 
napi_object_seal(napi_env env,napi_value object)1553 NAPI_INNER_EXTERN napi_status napi_object_seal(napi_env env, napi_value object)
1554 {
1555     CHECK_ENV(env);
1556     CHECK_ARG(env, object);
1557 
1558     auto nativeValue = reinterpret_cast<NativeValue*>(object);
1559     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
1560     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
1561 
1562     nativeObject->Seal();
1563 
1564     return napi_clear_last_error(env);
1565 }
1566 
1567 EXTERN_C_END
1568 
napi_create_typedarray(napi_env env,napi_typedarray_type type,size_t length,napi_value arraybuffer,size_t byte_offset,napi_value * result)1569 NAPI_EXTERN napi_status napi_create_typedarray(napi_env env,
1570                                                napi_typedarray_type type,
1571                                                size_t length,
1572                                                napi_value arraybuffer,
1573                                                size_t byte_offset,
1574                                                napi_value* result)
1575 {
1576     CHECK_ENV(env);
1577     CHECK_ARG(env, arraybuffer);
1578     CHECK_ARG(env, result);
1579 
1580     auto engine = reinterpret_cast<NativeEngine*>(env);
1581     auto value = reinterpret_cast<NativeValue*>(arraybuffer);
1582     auto typedArrayType = (NativeTypedArrayType)type;
1583 
1584     RETURN_STATUS_IF_FALSE(env, value->IsArrayBuffer(), napi_status::napi_arraybuffer_expected);
1585 
1586     auto resultValue = engine->CreateTypedArray(typedArrayType, value, length, byte_offset);
1587 
1588     *result = reinterpret_cast<napi_value>(resultValue);
1589     return napi_clear_last_error(env);
1590 }
1591 
napi_get_typedarray_info(napi_env env,napi_value typedarray,napi_typedarray_type * type,size_t * length,void ** data,napi_value * arraybuffer,size_t * byte_offset)1592 NAPI_EXTERN napi_status napi_get_typedarray_info(napi_env env,
1593                                                  napi_value typedarray,
1594                                                  napi_typedarray_type* type,
1595                                                  size_t* length,
1596                                                  void** data,
1597                                                  napi_value* arraybuffer,
1598                                                  size_t* byte_offset)
1599 {
1600     CHECK_ENV(env);
1601     CHECK_ARG(env, typedarray);
1602     CHECK_ARG(env, type);
1603     CHECK_ARG(env, length);
1604     CHECK_ARG(env, data);
1605     CHECK_ARG(env, arraybuffer);
1606     CHECK_ARG(env, byte_offset);
1607 
1608     auto value = reinterpret_cast<NativeValue*>(typedarray);
1609 
1610     RETURN_STATUS_IF_FALSE(env, value->IsTypedArray(), napi_status::napi_invalid_arg);
1611 
1612     auto nativeTypedArray = reinterpret_cast<NativeTypedArray*>(value->GetInterface(NativeTypedArray::INTERFACE_ID));
1613 
1614     *type = (napi_typedarray_type)nativeTypedArray->GetTypedArrayType();
1615     *length = nativeTypedArray->GetLength();
1616     *data = nativeTypedArray->GetData();
1617     *arraybuffer = reinterpret_cast<napi_value>(nativeTypedArray->GetArrayBuffer());
1618     *byte_offset = nativeTypedArray->GetOffset();
1619     return napi_clear_last_error(env);
1620 }
1621 
napi_create_dataview(napi_env env,size_t length,napi_value arraybuffer,size_t byte_offset,napi_value * result)1622 NAPI_EXTERN napi_status napi_create_dataview(
1623     napi_env env, size_t length, napi_value arraybuffer, size_t byte_offset, napi_value* result)
1624 {
1625     CHECK_ENV(env);
1626     CHECK_ARG(env, arraybuffer);
1627     CHECK_ARG(env, result);
1628 
1629     auto engine = reinterpret_cast<NativeEngine*>(env);
1630     auto arrayBufferValue = reinterpret_cast<NativeValue*>(arraybuffer);
1631 
1632     RETURN_STATUS_IF_FALSE(env, arrayBufferValue->IsArrayBuffer(), napi_status::napi_arraybuffer_expected);
1633 
1634     auto resultValue = engine->CreateDataView(arrayBufferValue, length, byte_offset);
1635 
1636     *result = reinterpret_cast<napi_value>(resultValue);
1637     return napi_clear_last_error(env);
1638 }
1639 
napi_is_dataview(napi_env env,napi_value value,bool * result)1640 NAPI_EXTERN napi_status napi_is_dataview(napi_env env, napi_value value, bool* result)
1641 {
1642     CHECK_ENV(env);
1643     CHECK_ARG(env, value);
1644     CHECK_ARG(env, result);
1645 
1646     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1647 
1648     *result = nativeValue->IsDataView();
1649     return napi_clear_last_error(env);
1650 }
1651 
napi_get_dataview_info(napi_env env,napi_value dataview,size_t * bytelength,void ** data,napi_value * arraybuffer,size_t * byte_offset)1652 NAPI_EXTERN napi_status napi_get_dataview_info(napi_env env,
1653                                                napi_value dataview,
1654                                                size_t* bytelength,
1655                                                void** data,
1656                                                napi_value* arraybuffer,
1657                                                size_t* byte_offset)
1658 {
1659     CHECK_ENV(env);
1660     CHECK_ARG(env, dataview);
1661     CHECK_ARG(env, bytelength);
1662     CHECK_ARG(env, data);
1663     CHECK_ARG(env, arraybuffer);
1664     CHECK_ARG(env, byte_offset);
1665 
1666     auto nativeValue = reinterpret_cast<NativeValue*>(dataview);
1667 
1668     RETURN_STATUS_IF_FALSE(env, nativeValue->IsDataView(), napi_status::napi_invalid_arg);
1669 
1670     auto nativeDataView = reinterpret_cast<NativeDataView*>(nativeValue->GetInterface(NativeDataView::INTERFACE_ID));
1671 
1672     *bytelength = nativeDataView->GetLength();
1673     *data = nativeDataView->GetBuffer();
1674     *arraybuffer = reinterpret_cast<napi_value>(nativeDataView->GetArrayBuffer());
1675     *byte_offset = nativeDataView->GetOffset();
1676     return napi_clear_last_error(env);
1677 }
1678 
1679 // version management
napi_get_version(napi_env env,uint32_t * result)1680 NAPI_EXTERN napi_status napi_get_version(napi_env env, uint32_t* result)
1681 {
1682     CHECK_ENV(env);
1683     CHECK_ARG(env, result);
1684 
1685     *result = NAPI_VERSION;
1686     return napi_clear_last_error(env);
1687 }
1688 
1689 // Promises
napi_create_promise(napi_env env,napi_deferred * deferred,napi_value * promise)1690 NAPI_EXTERN napi_status napi_create_promise(napi_env env, napi_deferred* deferred, napi_value* promise)
1691 {
1692     CHECK_ENV(env);
1693     CHECK_ARG(env, deferred);
1694     CHECK_ARG(env, promise);
1695 
1696     auto engine = reinterpret_cast<NativeEngine*>(env);
1697     auto resultValue = engine->CreatePromise(reinterpret_cast<NativeDeferred**>(deferred));
1698 
1699     *promise = reinterpret_cast<napi_value>(resultValue);
1700     return napi_clear_last_error(env);
1701 }
1702 
napi_resolve_deferred(napi_env env,napi_deferred deferred,napi_value resolution)1703 NAPI_EXTERN napi_status napi_resolve_deferred(napi_env env, napi_deferred deferred, napi_value resolution)
1704 {
1705     CHECK_ENV(env);
1706     CHECK_ARG(env, deferred);
1707     CHECK_ARG(env, resolution);
1708 
1709     auto nativeDeferred = reinterpret_cast<NativeDeferred*>(deferred);
1710     auto resolutionValue = reinterpret_cast<NativeValue*>(resolution);
1711 
1712     nativeDeferred->Resolve(resolutionValue);
1713     delete nativeDeferred;
1714     return napi_clear_last_error(env);
1715 }
1716 
napi_reject_deferred(napi_env env,napi_deferred deferred,napi_value rejection)1717 NAPI_EXTERN napi_status napi_reject_deferred(napi_env env, napi_deferred deferred, napi_value rejection)
1718 {
1719     CHECK_ENV(env);
1720     CHECK_ARG(env, deferred);
1721     CHECK_ARG(env, rejection);
1722 
1723     auto nativeDeferred = reinterpret_cast<NativeDeferred*>(deferred);
1724     auto rejectionValue = reinterpret_cast<NativeValue*>(rejection);
1725 
1726     nativeDeferred->Reject(rejectionValue);
1727     delete nativeDeferred;
1728     return napi_clear_last_error(env);
1729 }
1730 
napi_is_promise(napi_env env,napi_value value,bool * is_promise)1731 NAPI_EXTERN napi_status napi_is_promise(napi_env env, napi_value value, bool* is_promise)
1732 {
1733     CHECK_ENV(env);
1734     CHECK_ARG(env, value);
1735     CHECK_ARG(env, is_promise);
1736 
1737     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1738 
1739     *is_promise = nativeValue->IsPromise();
1740     return napi_clear_last_error(env);
1741 }
1742 
1743 // promise reject events
napi_set_promise_rejection_callback(napi_env env,napi_ref ref,napi_ref checkRef)1744 NAPI_EXTERN napi_status napi_set_promise_rejection_callback(napi_env env, napi_ref ref, napi_ref checkRef)
1745 {
1746     CHECK_ENV(env);
1747     CHECK_ARG(env, ref);
1748     CHECK_ARG(env, checkRef);
1749 
1750     auto engine = reinterpret_cast<NativeEngine*>(env);
1751     auto rejectCallbackRef = reinterpret_cast<NativeReference*>(ref);
1752     auto checkCallbackRef = reinterpret_cast<NativeReference*>(checkRef);
1753 
1754     engine->SetPromiseRejectCallback(rejectCallbackRef, checkCallbackRef);
1755     return napi_clear_last_error(env);
1756 }
1757 
1758 // Running a script
napi_run_script(napi_env env,napi_value script,napi_value * result)1759 NAPI_EXTERN napi_status napi_run_script(napi_env env, napi_value script, napi_value* result)
1760 {
1761     CHECK_ENV(env);
1762     CHECK_ARG(env, script);
1763     CHECK_ARG(env, result);
1764 
1765     auto engine = reinterpret_cast<NativeEngine*>(env);
1766     auto scriptValue = reinterpret_cast<NativeValue*>(script);
1767     RETURN_STATUS_IF_FALSE(env, scriptValue->TypeOf() == NATIVE_STRING, napi_status::napi_string_expected);
1768     auto resultValue = engine->RunScript(scriptValue);
1769     *result = reinterpret_cast<napi_value>(resultValue);
1770     return napi_clear_last_error(env);
1771 }
1772 
1773 // Runnint a buffer script, only used in ark
napi_run_buffer_script(napi_env env,std::vector<uint8_t> & buffer,napi_value * result)1774 NAPI_EXTERN napi_status napi_run_buffer_script(napi_env env, std::vector<uint8_t>& buffer, napi_value* result)
1775 {
1776     CHECK_ENV(env);
1777     CHECK_ARG(env, result);
1778 
1779     auto engine = reinterpret_cast<NativeEngine*>(env);
1780     auto resultValue = engine->RunBufferScript(buffer);
1781     *result = reinterpret_cast<napi_value>(resultValue);
1782     return napi_clear_last_error(env);
1783 }
1784 
napi_run_actor(napi_env env,std::vector<uint8_t> & buffer,const char * descriptor,napi_value * result)1785 NAPI_EXTERN napi_status napi_run_actor(napi_env env, std::vector<uint8_t>& buffer,
1786                                        const char* descriptor, napi_value* result)
1787 {
1788     CHECK_ENV(env);
1789     CHECK_ARG(env, result);
1790     auto engine = reinterpret_cast<NativeEngine*>(env);
1791     auto resultValue = engine->RunActor(buffer, descriptor);
1792     *result = reinterpret_cast<napi_value>(resultValue);
1793     return napi_clear_last_error(env);
1794 }
1795 
1796 // Memory management
napi_adjust_external_memory(napi_env env,int64_t change_in_bytes,int64_t * adjusted_value)1797 NAPI_INNER_EXTERN napi_status napi_adjust_external_memory(
1798     napi_env env, int64_t change_in_bytes, int64_t* adjusted_value)
1799 {
1800     CHECK_ENV(env);
1801     CHECK_ARG(env, adjusted_value);
1802 
1803     auto engine = reinterpret_cast<NativeEngine*>(env);
1804     engine->AdjustExternalMemory(change_in_bytes, adjusted_value);
1805 
1806     return napi_clear_last_error(env);
1807 }
1808 
napi_is_callable(napi_env env,napi_value value,bool * result)1809 NAPI_EXTERN napi_status napi_is_callable(napi_env env, napi_value value, bool* result)
1810 {
1811     CHECK_ENV(env);
1812     CHECK_ARG(env, value);
1813     CHECK_ARG(env, result);
1814 
1815     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1816 
1817     *result = nativeValue->IsCallable();
1818     return napi_clear_last_error(env);
1819 }
1820 
napi_is_arguments_object(napi_env env,napi_value value,bool * result)1821 NAPI_EXTERN napi_status napi_is_arguments_object(napi_env env, napi_value value, bool* result)
1822 {
1823     CHECK_ENV(env);
1824     CHECK_ARG(env, value);
1825     CHECK_ARG(env, result);
1826 
1827     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1828 
1829     *result = nativeValue->IsArgumentsObject();
1830     return napi_clear_last_error(env);
1831 }
1832 
napi_is_async_function(napi_env env,napi_value value,bool * result)1833 NAPI_EXTERN napi_status napi_is_async_function(napi_env env, napi_value value, bool* result)
1834 {
1835     CHECK_ENV(env);
1836     CHECK_ARG(env, value);
1837     CHECK_ARG(env, result);
1838 
1839     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1840 
1841     *result = nativeValue->IsAsyncFunction();
1842     return napi_clear_last_error(env);
1843 }
1844 
napi_is_boolean_object(napi_env env,napi_value value,bool * result)1845 NAPI_EXTERN napi_status napi_is_boolean_object(napi_env env, napi_value value, bool* result)
1846 {
1847     CHECK_ENV(env);
1848     CHECK_ARG(env, value);
1849     CHECK_ARG(env, result);
1850 
1851     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1852 
1853     *result = nativeValue->IsBooleanObject();
1854     return napi_clear_last_error(env);
1855 }
1856 
napi_is_generator_function(napi_env env,napi_value value,bool * result)1857 NAPI_EXTERN napi_status napi_is_generator_function(napi_env env, napi_value value, bool* result)
1858 {
1859     CHECK_ENV(env);
1860     CHECK_ARG(env, value);
1861     CHECK_ARG(env, result);
1862 
1863     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1864 
1865     *result = nativeValue->IsGeneratorFunction();
1866     return napi_clear_last_error(env);
1867 }
1868 
napi_is_map_iterator(napi_env env,napi_value value,bool * result)1869 NAPI_EXTERN napi_status napi_is_map_iterator(napi_env env, napi_value value, bool* result)
1870 {
1871     CHECK_ENV(env);
1872     CHECK_ARG(env, value);
1873     CHECK_ARG(env, result);
1874 
1875     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1876 
1877     *result = nativeValue->IsMapIterator();
1878     return napi_clear_last_error(env);
1879 }
1880 
napi_is_set_iterator(napi_env env,napi_value value,bool * result)1881 NAPI_EXTERN napi_status napi_is_set_iterator(napi_env env, napi_value value, bool* result)
1882 {
1883     CHECK_ENV(env);
1884     CHECK_ARG(env, value);
1885     CHECK_ARG(env, result);
1886 
1887     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1888 
1889     *result = nativeValue->IsSetIterator();
1890     return napi_clear_last_error(env);
1891 }
1892 
napi_is_generator_object(napi_env env,napi_value value,bool * result)1893 NAPI_EXTERN napi_status napi_is_generator_object(napi_env env, napi_value value, bool* result)
1894 {
1895     CHECK_ENV(env);
1896     CHECK_ARG(env, value);
1897     CHECK_ARG(env, result);
1898 
1899     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1900 
1901     *result = nativeValue->IsGeneratorObject();
1902     return napi_clear_last_error(env);
1903 }
1904 
napi_is_module_namespace_object(napi_env env,napi_value value,bool * result)1905 NAPI_EXTERN napi_status napi_is_module_namespace_object(napi_env env, napi_value value, bool* result)
1906 {
1907     CHECK_ENV(env);
1908     CHECK_ARG(env, value);
1909     CHECK_ARG(env, result);
1910 
1911     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1912 
1913     *result = nativeValue->IsModuleNamespaceObject();
1914     return napi_clear_last_error(env);
1915 }
1916 
napi_is_proxy(napi_env env,napi_value value,bool * result)1917 NAPI_EXTERN napi_status napi_is_proxy(napi_env env, napi_value value, bool* result)
1918 {
1919     CHECK_ENV(env);
1920     CHECK_ARG(env, value);
1921     CHECK_ARG(env, result);
1922 
1923     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1924 
1925     *result = nativeValue->IsProxy();
1926     return napi_clear_last_error(env);
1927 }
1928 
napi_is_reg_exp(napi_env env,napi_value value,bool * result)1929 NAPI_EXTERN napi_status napi_is_reg_exp(napi_env env, napi_value value, bool* result)
1930 {
1931     CHECK_ENV(env);
1932     CHECK_ARG(env, value);
1933     CHECK_ARG(env, result);
1934 
1935     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1936 
1937     *result = nativeValue->IsRegExp();
1938     return napi_clear_last_error(env);
1939 }
1940 
napi_is_number_object(napi_env env,napi_value value,bool * result)1941 NAPI_EXTERN napi_status napi_is_number_object(napi_env env, napi_value value, bool* result)
1942 {
1943     CHECK_ENV(env);
1944     CHECK_ARG(env, value);
1945     CHECK_ARG(env, result);
1946 
1947     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1948 
1949     *result = nativeValue->IsNumberObject();
1950     return napi_clear_last_error(env);
1951 }
1952 
napi_is_map(napi_env env,napi_value value,bool * result)1953 NAPI_EXTERN napi_status napi_is_map(napi_env env, napi_value value, bool* result)
1954 {
1955     CHECK_ENV(env);
1956     CHECK_ARG(env, value);
1957     CHECK_ARG(env, result);
1958 
1959     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1960 
1961     *result = nativeValue->IsMap();
1962     return napi_clear_last_error(env);
1963 }
1964 
napi_is_set(napi_env env,napi_value value,bool * result)1965 NAPI_EXTERN napi_status napi_is_set(napi_env env, napi_value value, bool* result)
1966 {
1967     CHECK_ENV(env);
1968     CHECK_ARG(env, value);
1969     CHECK_ARG(env, result);
1970 
1971     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1972 
1973     *result = nativeValue->IsSet();
1974     return napi_clear_last_error(env);
1975 }
1976 
napi_is_string_object(napi_env env,napi_value value,bool * result)1977 NAPI_EXTERN napi_status napi_is_string_object(napi_env env, napi_value value, bool* result)
1978 {
1979     CHECK_ENV(env);
1980     CHECK_ARG(env, value);
1981     CHECK_ARG(env, result);
1982 
1983     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1984 
1985     *result = nativeValue->IsStringObject();
1986     return napi_clear_last_error(env);
1987 }
1988 
napi_is_symbol_object(napi_env env,napi_value value,bool * result)1989 NAPI_EXTERN napi_status napi_is_symbol_object(napi_env env, napi_value value, bool* result)
1990 {
1991     CHECK_ENV(env);
1992     CHECK_ARG(env, value);
1993     CHECK_ARG(env, result);
1994 
1995     auto nativeValue = reinterpret_cast<NativeValue*>(value);
1996 
1997     *result = nativeValue->IsSymbolObject();
1998     return napi_clear_last_error(env);
1999 }
2000 
napi_is_weak_map(napi_env env,napi_value value,bool * result)2001 NAPI_EXTERN napi_status napi_is_weak_map(napi_env env, napi_value value, bool* result)
2002 {
2003     CHECK_ENV(env);
2004     CHECK_ARG(env, value);
2005     CHECK_ARG(env, result);
2006 
2007     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2008 
2009     *result = nativeValue->IsWeakMap();
2010     return napi_clear_last_error(env);
2011 }
2012 
napi_is_weak_set(napi_env env,napi_value value,bool * result)2013 NAPI_EXTERN napi_status napi_is_weak_set(napi_env env, napi_value value, bool* result)
2014 {
2015     CHECK_ENV(env);
2016     CHECK_ARG(env, value);
2017     CHECK_ARG(env, result);
2018 
2019     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2020 
2021     *result = nativeValue->IsWeakSet();
2022     return napi_clear_last_error(env);
2023 }
2024 
napi_create_runtime(napi_env env,napi_env * result_env)2025 NAPI_EXTERN napi_status napi_create_runtime(napi_env env, napi_env* result_env)
2026 {
2027     CHECK_ENV(env);
2028     CHECK_ARG(env, result_env);
2029 
2030     auto engine = reinterpret_cast<NativeEngine*>(env);
2031 
2032     auto result = engine->CreateRuntime();
2033     *result_env = reinterpret_cast<napi_env>(result);
2034 
2035     return napi_clear_last_error(env);
2036 }
2037 
napi_serialize(napi_env env,napi_value object,napi_value transfer_list,napi_value * result)2038 NAPI_EXTERN napi_status napi_serialize(napi_env env, napi_value object, napi_value transfer_list, napi_value* result)
2039 {
2040     CHECK_ENV(env);
2041     CHECK_ARG(env, object);
2042     CHECK_ARG(env, transfer_list);
2043     CHECK_ARG(env, result);
2044 
2045     auto engine = reinterpret_cast<NativeEngine*>(env);
2046     auto nativeValue = reinterpret_cast<NativeValue*>(object);
2047     auto transferList = reinterpret_cast<NativeValue*>(transfer_list);
2048 
2049     auto resultValue = engine->Serialize(engine, nativeValue, transferList);
2050     *result = reinterpret_cast<napi_value>(resultValue);
2051 
2052     return napi_clear_last_error(env);
2053 }
2054 
napi_deserialize(napi_env env,napi_value recorder,napi_value * object)2055 NAPI_EXTERN napi_status napi_deserialize(napi_env env, napi_value recorder, napi_value* object)
2056 {
2057     CHECK_ENV(env);
2058     CHECK_ARG(env, recorder);
2059     CHECK_ARG(env, object);
2060 
2061     auto engine = reinterpret_cast<NativeEngine*>(env);
2062     auto recorderValue = reinterpret_cast<NativeValue*>(recorder);
2063 
2064     auto result = engine->Deserialize(engine, recorderValue);
2065     *object = reinterpret_cast<napi_value>(result);
2066 
2067     return napi_clear_last_error(env);
2068 }
2069 
napi_delete_serialization_data(napi_env env,napi_value value)2070 NAPI_EXTERN napi_status napi_delete_serialization_data(napi_env env, napi_value value)
2071 {
2072     CHECK_ENV(env);
2073     CHECK_ARG(env, value);
2074 
2075     auto engine = reinterpret_cast<NativeEngine*>(env);
2076     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2077     engine->DeleteSerializationData(nativeValue);
2078 
2079     return napi_clear_last_error(env);
2080 }
2081 
napi_get_exception_info_for_worker(napi_env env,napi_value obj)2082 NAPI_EXTERN napi_status napi_get_exception_info_for_worker(napi_env env, napi_value obj)
2083 {
2084     CHECK_ENV(env);
2085     CHECK_ARG(env, obj);
2086     auto engine = reinterpret_cast<NativeEngine*>(env);
2087     ExceptionInfo* exceptionInfo = engine->GetExceptionForWorker();
2088     if (exceptionInfo == nullptr) {
2089         HILOG_INFO("engine get exception info error");
2090         return napi_invalid_arg;
2091     }
2092 
2093     napi_value lineno = nullptr;
2094     napi_create_int32(env, exceptionInfo->lineno_, &lineno);
2095     napi_set_named_property(env, obj, "lineno", lineno);
2096 
2097     napi_value colno = nullptr;
2098     napi_create_int32(env, exceptionInfo->colno_, &colno);
2099     napi_set_named_property(env, obj, "colno", colno);
2100 
2101     if (exceptionInfo->message_ != nullptr) {
2102         napi_value messageValue = nullptr;
2103         uint32_t messageLen = strlen(exceptionInfo->message_);
2104         napi_create_string_utf8(env, exceptionInfo->message_, messageLen, &messageValue);
2105         napi_set_named_property(env, obj, "message", messageValue);
2106     }
2107 
2108     delete exceptionInfo;
2109     return napi_clear_last_error(env);
2110 }
2111 
napi_create_bigint_int64(napi_env env,int64_t value,napi_value * result)2112 NAPI_INNER_EXTERN napi_status napi_create_bigint_int64(napi_env env, int64_t value, napi_value* result)
2113 {
2114     CHECK_ENV(env);
2115     CHECK_ARG(env, result);
2116 
2117     auto engine = reinterpret_cast<NativeEngine*>(env);
2118     auto resultValue = engine->CreateBigInt(value);
2119 
2120     *result = reinterpret_cast<napi_value>(resultValue);
2121     return napi_clear_last_error(env);
2122 }
2123 
napi_create_bigint_uint64(napi_env env,uint64_t value,napi_value * result)2124 NAPI_EXTERN napi_status napi_create_bigint_uint64(napi_env env, uint64_t value, napi_value* result)
2125 {
2126     CHECK_ENV(env);
2127     CHECK_ARG(env, result);
2128 
2129     auto engine = reinterpret_cast<NativeEngine*>(env);
2130     auto resultValue = engine->CreateBigInt(value);
2131 
2132     *result = reinterpret_cast<napi_value>(resultValue);
2133     return napi_clear_last_error(env);
2134 }
2135 
napi_get_value_bigint_int64(napi_env env,napi_value value,int64_t * result,bool * lossless)2136 NAPI_INNER_EXTERN napi_status napi_get_value_bigint_int64(
2137     napi_env env, napi_value value, int64_t* result, bool* lossless)
2138 {
2139     CHECK_ENV(env);
2140     CHECK_ARG(env, value);
2141     CHECK_ARG(env, result);
2142     CHECK_ARG(env, lossless);
2143 
2144     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2145     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_BIGINT, napi_bigint_expected);
2146 
2147     auto nativeBigint = reinterpret_cast<NativeBigint*>(nativeValue->GetInterface(NativeBigint::INTERFACE_ID));
2148     nativeBigint->Int64Value(result, lossless);
2149     return napi_clear_last_error(env);
2150 }
2151 
napi_get_value_bigint_uint64(napi_env env,napi_value value,uint64_t * result,bool * lossless)2152 NAPI_EXTERN napi_status napi_get_value_bigint_uint64(
2153     napi_env env, napi_value value, uint64_t* result, bool* lossless)
2154 {
2155     CHECK_ENV(env);
2156     CHECK_ARG(env, value);
2157     CHECK_ARG(env, result);
2158     CHECK_ARG(env, lossless);
2159 
2160     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2161     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_BIGINT, napi_bigint_expected);
2162     auto nativeBigint = reinterpret_cast<NativeBigint*>(nativeValue->GetInterface(NativeBigint::INTERFACE_ID));
2163     nativeBigint->Uint64Value(result, lossless);
2164     return napi_clear_last_error(env);
2165 }
2166 
napi_is_date(napi_env env,napi_value value,bool * result)2167 NAPI_EXTERN napi_status napi_is_date(napi_env env, napi_value value, bool* result)
2168 {
2169     CHECK_ENV(env);
2170     CHECK_ARG(env, value);
2171     CHECK_ARG(env, result);
2172 
2173     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2174 
2175     *result = nativeValue->IsDate();
2176     return napi_clear_last_error(env);
2177 }
2178 
napi_is_detached_arraybuffer(napi_env env,napi_value arraybuffer,bool * result)2179 NAPI_INNER_EXTERN napi_status napi_is_detached_arraybuffer(napi_env env, napi_value arraybuffer, bool* result)
2180 {
2181     CHECK_ENV(env);
2182     CHECK_ARG(env, arraybuffer);
2183     CHECK_ARG(env, result);
2184 
2185     auto nativeValue = reinterpret_cast<NativeValue*>(arraybuffer);
2186     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
2187     auto ArrayBuffer_result = nativeValue->IsArrayBuffer();
2188     if (ArrayBuffer_result) {
2189         auto nativeArrayBuffer =
2190             reinterpret_cast<NativeArrayBuffer*>(nativeValue->GetInterface(NativeArrayBuffer::INTERFACE_ID));
2191         *result = nativeArrayBuffer->IsDetachedArrayBuffer();
2192     } else {
2193         return napi_set_last_error(env, napi_invalid_arg);
2194     }
2195     return napi_clear_last_error(env);
2196 }
2197 
napi_get_all_property_names(napi_env env,napi_value object,napi_key_collection_mode key_mode,napi_key_filter key_filter,napi_key_conversion key_conversion,napi_value * result)2198 NAPI_INNER_EXTERN napi_status napi_get_all_property_names(
2199     napi_env env, napi_value object, napi_key_collection_mode key_mode,
2200     napi_key_filter key_filter, napi_key_conversion key_conversion, napi_value* result)
2201 {
2202     CHECK_ENV(env);
2203     CHECK_ARG(env, object);
2204     CHECK_ARG(env, result);
2205 
2206     auto nativeValue = reinterpret_cast<NativeValue*>(object);
2207 
2208     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT || nativeValue->TypeOf() == NATIVE_FUNCTION,
2209         napi_object_expected);
2210 
2211     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
2212 
2213     auto resultValue = nativeObject->GetAllPropertyNames(key_mode, key_filter, key_conversion);
2214     *result = reinterpret_cast<napi_value>(resultValue);
2215     return napi_clear_last_error(env);
2216 }
2217 
napi_detach_arraybuffer(napi_env env,napi_value arraybuffer)2218 NAPI_INNER_EXTERN napi_status napi_detach_arraybuffer(napi_env env, napi_value arraybuffer)
2219 {
2220     CHECK_ENV(env);
2221     CHECK_ARG(env, arraybuffer);
2222 
2223     auto nativeValue = reinterpret_cast<NativeValue*>(arraybuffer);
2224     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
2225 
2226     auto ArrayBuffer_result = nativeValue->IsArrayBuffer();
2227     if (ArrayBuffer_result) {
2228         auto nativeArrayBuffer =
2229             reinterpret_cast<NativeArrayBuffer*>(nativeValue->GetInterface(NativeArrayBuffer::INTERFACE_ID));
2230 
2231         auto ret = nativeArrayBuffer->DetachArrayBuffer();
2232         if (!ret) {
2233             return napi_set_last_error(env, napi_detachable_arraybuffer_expected);
2234         }
2235     } else {
2236         return napi_set_last_error(env, napi_invalid_arg);
2237     }
2238     return napi_clear_last_error(env);
2239 }
2240 
napi_type_tag_object(napi_env env,napi_value js_object,const napi_type_tag * type_tag)2241 NAPI_INNER_EXTERN napi_status napi_type_tag_object(napi_env env, napi_value js_object, const napi_type_tag* type_tag)
2242 {
2243     CHECK_ENV(env);
2244     CHECK_ARG(env, js_object);
2245     CHECK_ARG(env, type_tag);
2246     bool result = true;
2247 
2248     auto nativeValue = reinterpret_cast<NativeValue*>(js_object);
2249 
2250     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
2251 
2252     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
2253 
2254     result = nativeObject->AssociateTypeTag((NapiTypeTag*)type_tag);
2255 
2256     if (!result) {
2257         return napi_set_last_error(env, napi_invalid_arg);
2258     }
2259 
2260     return napi_clear_last_error(env);
2261 }
2262 
napi_check_object_type_tag(napi_env env,napi_value js_object,const napi_type_tag * type_tag,bool * result)2263 NAPI_INNER_EXTERN napi_status napi_check_object_type_tag(
2264     napi_env env, napi_value js_object, const napi_type_tag* type_tag, bool* result)
2265 {
2266     CHECK_ENV(env);
2267     CHECK_ARG(env, js_object);
2268     CHECK_ARG(env, type_tag);
2269     CHECK_ARG(env, result);
2270 
2271     auto nativeValue = reinterpret_cast<NativeValue*>(js_object);
2272 
2273     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
2274 
2275     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
2276     *result = nativeObject->CheckTypeTag((NapiTypeTag*)type_tag);
2277 
2278     return napi_clear_last_error(env);
2279 }
2280 
napi_create_date(napi_env env,double time,napi_value * result)2281 NAPI_INNER_EXTERN napi_status napi_create_date(napi_env env, double time, napi_value* result)
2282 {
2283     CHECK_ENV(env);
2284     CHECK_ARG(env, result);
2285 
2286     auto engine = reinterpret_cast<NativeEngine*>(env);
2287     auto resultValue = engine->CreateDate(time);
2288     *result = reinterpret_cast<napi_value>(resultValue);
2289     return napi_clear_last_error(env);
2290 }
2291 
napi_get_date_value(napi_env env,napi_value value,double * result)2292 NAPI_INNER_EXTERN napi_status napi_get_date_value(napi_env env, napi_value value, double* result)
2293 {
2294     CHECK_ENV(env);
2295     CHECK_ARG(env, value);
2296     CHECK_ARG(env, result);
2297 
2298     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2299     auto IsDate_result = nativeValue->IsDate();
2300     if (IsDate_result) {
2301         auto nativeDate = reinterpret_cast<NativeDate*>(nativeValue->GetInterface(NativeDate::INTERFACE_ID));
2302         *result = nativeDate->GetTime();
2303     } else {
2304         return napi_set_last_error(env, napi_date_expected);
2305     }
2306 
2307     return napi_clear_last_error(env);
2308 }
2309 
napi_add_finalizer(napi_env env,napi_value js_object,void * native_object,napi_finalize finalize_cb,void * finalize_hint,napi_ref * result)2310 NAPI_INNER_EXTERN napi_status napi_add_finalizer(napi_env env, napi_value js_object, void* native_object,
2311     napi_finalize finalize_cb, void* finalize_hint, napi_ref* result)
2312 {
2313     CHECK_ENV(env);
2314     CHECK_ARG(env, js_object);
2315     CHECK_ARG(env, finalize_cb);
2316 
2317     auto nativeValue = reinterpret_cast<NativeValue*>(js_object);
2318     auto callback = reinterpret_cast<NativeFinalize>(finalize_cb);
2319     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_OBJECT, napi_object_expected);
2320     auto nativeObject = reinterpret_cast<NativeObject*>(nativeValue->GetInterface(NativeObject::INTERFACE_ID));
2321     nativeObject->AddFinalizer(native_object, callback, finalize_hint);
2322     if (result != nullptr) {
2323         auto engine = reinterpret_cast<NativeEngine*>(env);
2324         auto reference = engine->CreateReference(nativeValue, 1, callback, native_object, finalize_hint);
2325         *result = reinterpret_cast<napi_ref>(reference);
2326     }
2327     return napi_clear_last_error(env);
2328 }
2329 
napi_create_bigint_words(napi_env env,int sign_bit,size_t word_count,const uint64_t * words,napi_value * result)2330 NAPI_INNER_EXTERN napi_status napi_create_bigint_words(
2331     napi_env env, int sign_bit, size_t word_count, const uint64_t* words, napi_value* result)
2332 {
2333     CHECK_ENV(env);
2334     CHECK_ARG(env, words);
2335     CHECK_ARG(env, result);
2336 
2337     auto engine = reinterpret_cast<NativeEngine*>(env);
2338     auto resultValue = engine->CreateBigWords(sign_bit, word_count, words);
2339 
2340     *result = reinterpret_cast<napi_value>(resultValue);
2341     return napi_clear_last_error(env);
2342 }
2343 
napi_get_value_bigint_words(napi_env env,napi_value value,int * sign_bit,size_t * word_count,uint64_t * words)2344 NAPI_INNER_EXTERN napi_status napi_get_value_bigint_words(
2345     napi_env env, napi_value value, int* sign_bit, size_t* word_count, uint64_t* words)
2346 {
2347     CHECK_ENV(env);
2348     CHECK_ARG(env, value);
2349     CHECK_ARG(env, word_count);
2350 
2351     auto nativeValue = reinterpret_cast<NativeValue*>(value);
2352 
2353     RETURN_STATUS_IF_FALSE(env, nativeValue->TypeOf() == NATIVE_BIGINT, napi_object_expected);
2354 
2355     auto nativeBigint = reinterpret_cast<NativeBigint*>(nativeValue->GetInterface(NativeBigint::INTERFACE_ID));
2356 
2357     auto resultValue = nativeBigint->GetWordsArray(sign_bit, word_count, words);
2358 
2359     if (resultValue == false) {
2360         return napi_set_last_error(env, napi_invalid_arg);
2361     }
2362 
2363     return napi_clear_last_error(env);
2364 }
2365 
napi_run_script_path(napi_env env,const char * path,napi_value * result)2366 NAPI_EXTERN napi_status napi_run_script_path(napi_env env, const char* path, napi_value* result)
2367 {
2368     CHECK_ENV(env);
2369     CHECK_ARG(env, result);
2370     auto engine = reinterpret_cast<NativeEngine*>(env);
2371     auto resultValue = engine->RunScript(path);
2372     *result = reinterpret_cast<napi_value>(resultValue);
2373     return napi_clear_last_error(env);
2374 }
2375