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