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