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