1 #include <js_native_api.h>
2 #include "../common.h"
3 #include <string.h>
4 #include "test_null.h"
5
6 static int test_value = 3;
7
Get(napi_env env,napi_callback_info info)8 static napi_value Get(napi_env env, napi_callback_info info) {
9 size_t argc = 2;
10 napi_value args[2];
11 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
12
13 NODE_API_ASSERT(env, argc >= 2, "Wrong number of arguments");
14
15 napi_valuetype valuetype0;
16 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
17
18 NODE_API_ASSERT(env, valuetype0 == napi_object,
19 "Wrong type of arguments. Expects an object as first argument.");
20
21 napi_valuetype valuetype1;
22 NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
23
24 NODE_API_ASSERT(env, valuetype1 == napi_string || valuetype1 == napi_symbol,
25 "Wrong type of arguments. Expects a string or symbol as second.");
26
27 napi_value object = args[0];
28 napi_value output;
29 NODE_API_CALL(env, napi_get_property(env, object, args[1], &output));
30
31 return output;
32 }
33
GetNamed(napi_env env,napi_callback_info info)34 static napi_value GetNamed(napi_env env, napi_callback_info info) {
35 size_t argc = 2;
36 napi_value args[2];
37 char key[256] = "";
38 size_t key_length;
39 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
40
41 NODE_API_ASSERT(env, argc >= 2, "Wrong number of arguments");
42
43 napi_valuetype value_type0;
44 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
45
46 NODE_API_ASSERT(env, value_type0 == napi_object,
47 "Wrong type of arguments. Expects an object as first argument.");
48
49 napi_valuetype value_type1;
50 NODE_API_CALL(env, napi_typeof(env, args[1], &value_type1));
51
52 NODE_API_ASSERT(env, value_type1 == napi_string,
53 "Wrong type of arguments. Expects a string as second.");
54
55 napi_value object = args[0];
56 NODE_API_CALL(env,
57 napi_get_value_string_utf8(env, args[1], key, 255, &key_length));
58 key[255] = 0;
59 NODE_API_ASSERT(env, key_length <= 255,
60 "Cannot accommodate keys longer than 255 bytes");
61 napi_value output;
62 NODE_API_CALL(env, napi_get_named_property(env, object, key, &output));
63
64 return output;
65 }
66
GetPropertyNames(napi_env env,napi_callback_info info)67 static napi_value GetPropertyNames(napi_env env, napi_callback_info info) {
68 size_t argc = 1;
69 napi_value args[1];
70 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
71
72 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
73
74 napi_valuetype value_type0;
75 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
76
77 NODE_API_ASSERT(env, value_type0 == napi_object,
78 "Wrong type of arguments. Expects an object as first argument.");
79
80 napi_value output;
81 NODE_API_CALL(env, napi_get_property_names(env, args[0], &output));
82
83 return output;
84 }
85
GetSymbolNames(napi_env env,napi_callback_info info)86 static napi_value GetSymbolNames(napi_env env, napi_callback_info info) {
87 size_t argc = 1;
88 napi_value args[1];
89 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
90
91 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
92
93 napi_valuetype value_type0;
94 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
95
96 NODE_API_ASSERT(env,
97 value_type0 == napi_object,
98 "Wrong type of arguments. Expects an object as first argument.");
99
100 napi_value output;
101 NODE_API_CALL(env,
102 napi_get_all_property_names(
103 env, args[0], napi_key_include_prototypes, napi_key_skip_strings,
104 napi_key_numbers_to_strings, &output));
105
106 return output;
107 }
108
GetEnumerableWritableNames(napi_env env,napi_callback_info info)109 static napi_value GetEnumerableWritableNames(napi_env env,
110 napi_callback_info info) {
111 size_t argc = 1;
112 napi_value args[1];
113 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
114
115 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
116
117 napi_valuetype value_type0;
118 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
119
120 NODE_API_ASSERT(
121 env,
122 value_type0 == napi_object,
123 "Wrong type of arguments. Expects an object as first argument.");
124
125 napi_value output;
126 NODE_API_CALL(
127 env,
128 napi_get_all_property_names(env,
129 args[0],
130 napi_key_include_prototypes,
131 napi_key_enumerable | napi_key_writable,
132 napi_key_numbers_to_strings,
133 &output));
134
135 return output;
136 }
137
GetOwnWritableNames(napi_env env,napi_callback_info info)138 static napi_value GetOwnWritableNames(napi_env env, napi_callback_info info) {
139 size_t argc = 1;
140 napi_value args[1];
141 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
142
143 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
144
145 napi_valuetype value_type0;
146 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
147
148 NODE_API_ASSERT(
149 env,
150 value_type0 == napi_object,
151 "Wrong type of arguments. Expects an object as first argument.");
152
153 napi_value output;
154 NODE_API_CALL(env,
155 napi_get_all_property_names(env,
156 args[0],
157 napi_key_own_only,
158 napi_key_writable,
159 napi_key_numbers_to_strings,
160 &output));
161
162 return output;
163 }
164
GetEnumerableConfigurableNames(napi_env env,napi_callback_info info)165 static napi_value GetEnumerableConfigurableNames(napi_env env,
166 napi_callback_info info) {
167 size_t argc = 1;
168 napi_value args[1];
169 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
170
171 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
172
173 napi_valuetype value_type0;
174 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
175
176 NODE_API_ASSERT(
177 env,
178 value_type0 == napi_object,
179 "Wrong type of arguments. Expects an object as first argument.");
180
181 napi_value output;
182 NODE_API_CALL(
183 env,
184 napi_get_all_property_names(env,
185 args[0],
186 napi_key_include_prototypes,
187 napi_key_enumerable | napi_key_configurable,
188 napi_key_numbers_to_strings,
189 &output));
190
191 return output;
192 }
193
GetOwnConfigurableNames(napi_env env,napi_callback_info info)194 static napi_value GetOwnConfigurableNames(napi_env env,
195 napi_callback_info info) {
196 size_t argc = 1;
197 napi_value args[1];
198 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
199
200 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
201
202 napi_valuetype value_type0;
203 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
204
205 NODE_API_ASSERT(
206 env,
207 value_type0 == napi_object,
208 "Wrong type of arguments. Expects an object as first argument.");
209
210 napi_value output;
211 NODE_API_CALL(env,
212 napi_get_all_property_names(env,
213 args[0],
214 napi_key_own_only,
215 napi_key_configurable,
216 napi_key_numbers_to_strings,
217 &output));
218
219 return output;
220 }
221
Set(napi_env env,napi_callback_info info)222 static napi_value Set(napi_env env, napi_callback_info info) {
223 size_t argc = 3;
224 napi_value args[3];
225 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
226
227 NODE_API_ASSERT(env, argc >= 3, "Wrong number of arguments");
228
229 napi_valuetype valuetype0;
230 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
231
232 NODE_API_ASSERT(env, valuetype0 == napi_object,
233 "Wrong type of arguments. Expects an object as first argument.");
234
235 napi_valuetype valuetype1;
236 NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
237
238 NODE_API_ASSERT(env, valuetype1 == napi_string || valuetype1 == napi_symbol,
239 "Wrong type of arguments. Expects a string or symbol as second.");
240
241 NODE_API_CALL(env, napi_set_property(env, args[0], args[1], args[2]));
242
243 napi_value valuetrue;
244 NODE_API_CALL(env, napi_get_boolean(env, true, &valuetrue));
245
246 return valuetrue;
247 }
248
SetNamed(napi_env env,napi_callback_info info)249 static napi_value SetNamed(napi_env env, napi_callback_info info) {
250 size_t argc = 3;
251 napi_value args[3];
252 char key[256] = "";
253 size_t key_length;
254 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
255
256 NODE_API_ASSERT(env, argc >= 3, "Wrong number of arguments");
257
258 napi_valuetype value_type0;
259 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
260
261 NODE_API_ASSERT(env, value_type0 == napi_object,
262 "Wrong type of arguments. Expects an object as first argument.");
263
264 napi_valuetype value_type1;
265 NODE_API_CALL(env, napi_typeof(env, args[1], &value_type1));
266
267 NODE_API_ASSERT(env, value_type1 == napi_string,
268 "Wrong type of arguments. Expects a string as second.");
269
270 NODE_API_CALL(env,
271 napi_get_value_string_utf8(env, args[1], key, 255, &key_length));
272 key[255] = 0;
273 NODE_API_ASSERT(env, key_length <= 255,
274 "Cannot accommodate keys longer than 255 bytes");
275
276 NODE_API_CALL(env, napi_set_named_property(env, args[0], key, args[2]));
277
278 napi_value value_true;
279 NODE_API_CALL(env, napi_get_boolean(env, true, &value_true));
280
281 return value_true;
282 }
283
Has(napi_env env,napi_callback_info info)284 static napi_value Has(napi_env env, napi_callback_info info) {
285 size_t argc = 2;
286 napi_value args[2];
287 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
288
289 NODE_API_ASSERT(env, argc >= 2, "Wrong number of arguments");
290
291 napi_valuetype valuetype0;
292 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
293
294 NODE_API_ASSERT(env, valuetype0 == napi_object,
295 "Wrong type of arguments. Expects an object as first argument.");
296
297 napi_valuetype valuetype1;
298 NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
299
300 NODE_API_ASSERT(env, valuetype1 == napi_string || valuetype1 == napi_symbol,
301 "Wrong type of arguments. Expects a string or symbol as second.");
302
303 bool has_property;
304 NODE_API_CALL(env, napi_has_property(env, args[0], args[1], &has_property));
305
306 napi_value ret;
307 NODE_API_CALL(env, napi_get_boolean(env, has_property, &ret));
308
309 return ret;
310 }
311
HasNamed(napi_env env,napi_callback_info info)312 static napi_value HasNamed(napi_env env, napi_callback_info info) {
313 size_t argc = 2;
314 napi_value args[2];
315 char key[256] = "";
316 size_t key_length;
317 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
318
319 NODE_API_ASSERT(env, argc >= 2, "Wrong number of arguments");
320
321 napi_valuetype value_type0;
322 NODE_API_CALL(env, napi_typeof(env, args[0], &value_type0));
323
324 NODE_API_ASSERT(env, value_type0 == napi_object,
325 "Wrong type of arguments. Expects an object as first argument.");
326
327 napi_valuetype value_type1;
328 NODE_API_CALL(env, napi_typeof(env, args[1], &value_type1));
329
330 NODE_API_ASSERT(env, value_type1 == napi_string || value_type1 == napi_symbol,
331 "Wrong type of arguments. Expects a string as second.");
332
333 NODE_API_CALL(env,
334 napi_get_value_string_utf8(env, args[1], key, 255, &key_length));
335 key[255] = 0;
336 NODE_API_ASSERT(env, key_length <= 255,
337 "Cannot accommodate keys longer than 255 bytes");
338
339 bool has_property;
340 NODE_API_CALL(env, napi_has_named_property(env, args[0], key, &has_property));
341
342 napi_value ret;
343 NODE_API_CALL(env, napi_get_boolean(env, has_property, &ret));
344
345 return ret;
346 }
347
HasOwn(napi_env env,napi_callback_info info)348 static napi_value HasOwn(napi_env env, napi_callback_info info) {
349 size_t argc = 2;
350 napi_value args[2];
351 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
352
353 NODE_API_ASSERT(env, argc == 2, "Wrong number of arguments");
354
355 napi_valuetype valuetype0;
356 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
357
358 NODE_API_ASSERT(env, valuetype0 == napi_object,
359 "Wrong type of arguments. Expects an object as first argument.");
360
361 // napi_valuetype valuetype1;
362 // NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
363 //
364 // NODE_API_ASSERT(env, valuetype1 == napi_string || valuetype1 == napi_symbol,
365 // "Wrong type of arguments. Expects a string or symbol as second.");
366
367 bool has_property;
368 NODE_API_CALL(env, napi_has_own_property(env, args[0], args[1], &has_property));
369
370 napi_value ret;
371 NODE_API_CALL(env, napi_get_boolean(env, has_property, &ret));
372
373 return ret;
374 }
375
Delete(napi_env env,napi_callback_info info)376 static napi_value Delete(napi_env env, napi_callback_info info) {
377 size_t argc = 2;
378 napi_value args[2];
379
380 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
381 NODE_API_ASSERT(env, argc == 2, "Wrong number of arguments");
382
383 napi_valuetype valuetype0;
384 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
385 NODE_API_ASSERT(env, valuetype0 == napi_object,
386 "Wrong type of arguments. Expects an object as first argument.");
387
388 napi_valuetype valuetype1;
389 NODE_API_CALL(env, napi_typeof(env, args[1], &valuetype1));
390 NODE_API_ASSERT(env, valuetype1 == napi_string || valuetype1 == napi_symbol,
391 "Wrong type of arguments. Expects a string or symbol as second.");
392
393 bool result;
394 napi_value ret;
395 NODE_API_CALL(env, napi_delete_property(env, args[0], args[1], &result));
396 NODE_API_CALL(env, napi_get_boolean(env, result, &ret));
397
398 return ret;
399 }
400
New(napi_env env,napi_callback_info info)401 static napi_value New(napi_env env, napi_callback_info info) {
402 napi_value ret;
403 NODE_API_CALL(env, napi_create_object(env, &ret));
404
405 napi_value num;
406 NODE_API_CALL(env, napi_create_int32(env, 987654321, &num));
407
408 NODE_API_CALL(env, napi_set_named_property(env, ret, "test_number", num));
409
410 napi_value str;
411 const char* str_val = "test string";
412 size_t str_len = strlen(str_val);
413 NODE_API_CALL(env, napi_create_string_utf8(env, str_val, str_len, &str));
414
415 NODE_API_CALL(env, napi_set_named_property(env, ret, "test_string", str));
416
417 return ret;
418 }
419
Inflate(napi_env env,napi_callback_info info)420 static napi_value Inflate(napi_env env, napi_callback_info info) {
421 size_t argc = 1;
422 napi_value args[1];
423 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
424
425 NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments");
426
427 napi_valuetype valuetype0;
428 NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0));
429
430 NODE_API_ASSERT(env, valuetype0 == napi_object,
431 "Wrong type of arguments. Expects an object as first argument.");
432
433 napi_value obj = args[0];
434 napi_value propertynames;
435 NODE_API_CALL(env, napi_get_property_names(env, obj, &propertynames));
436
437 uint32_t i, length;
438 NODE_API_CALL(env, napi_get_array_length(env, propertynames, &length));
439
440 for (i = 0; i < length; i++) {
441 napi_value property_str;
442 NODE_API_CALL(env, napi_get_element(env, propertynames, i, &property_str));
443
444 napi_value value;
445 NODE_API_CALL(env, napi_get_property(env, obj, property_str, &value));
446
447 double double_val;
448 NODE_API_CALL(env, napi_get_value_double(env, value, &double_val));
449 NODE_API_CALL(env, napi_create_double(env, double_val + 1, &value));
450 NODE_API_CALL(env, napi_set_property(env, obj, property_str, value));
451 }
452
453 return obj;
454 }
455
Wrap(napi_env env,napi_callback_info info)456 static napi_value Wrap(napi_env env, napi_callback_info info) {
457 size_t argc = 1;
458 napi_value arg;
459 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, &arg, NULL, NULL));
460
461 NODE_API_CALL(env, napi_wrap(env, arg, &test_value, NULL, NULL, NULL));
462 return NULL;
463 }
464
Unwrap(napi_env env,napi_callback_info info)465 static napi_value Unwrap(napi_env env, napi_callback_info info) {
466 size_t argc = 1;
467 napi_value arg;
468 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, &arg, NULL, NULL));
469
470 void* data;
471 NODE_API_CALL(env, napi_unwrap(env, arg, &data));
472
473 bool is_expected = (data != NULL && *(int*)data == 3);
474 napi_value result;
475 NODE_API_CALL(env, napi_get_boolean(env, is_expected, &result));
476 return result;
477 }
478
TestSetProperty(napi_env env,napi_callback_info info)479 static napi_value TestSetProperty(napi_env env,
480 napi_callback_info info) {
481 napi_status status;
482 napi_value object, key, value;
483
484 NODE_API_CALL(env, napi_create_object(env, &object));
485
486 NODE_API_CALL(env, napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, &key));
487
488 NODE_API_CALL(env, napi_create_object(env, &value));
489
490 status = napi_set_property(NULL, object, key, value);
491
492 add_returned_status(env,
493 "envIsNull",
494 object,
495 "Invalid argument",
496 napi_invalid_arg,
497 status);
498
499 napi_set_property(env, NULL, key, value);
500
501 add_last_status(env, "objectIsNull", object);
502
503 napi_set_property(env, object, NULL, value);
504
505 add_last_status(env, "keyIsNull", object);
506
507 napi_set_property(env, object, key, NULL);
508
509 add_last_status(env, "valueIsNull", object);
510
511 return object;
512 }
513
TestHasProperty(napi_env env,napi_callback_info info)514 static napi_value TestHasProperty(napi_env env,
515 napi_callback_info info) {
516 napi_status status;
517 napi_value object, key;
518 bool result;
519
520 NODE_API_CALL(env, napi_create_object(env, &object));
521
522 NODE_API_CALL(env, napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, &key));
523
524 status = napi_has_property(NULL, object, key, &result);
525
526 add_returned_status(env,
527 "envIsNull",
528 object,
529 "Invalid argument",
530 napi_invalid_arg,
531 status);
532
533 napi_has_property(env, NULL, key, &result);
534
535 add_last_status(env, "objectIsNull", object);
536
537 napi_has_property(env, object, NULL, &result);
538
539 add_last_status(env, "keyIsNull", object);
540
541 napi_has_property(env, object, key, NULL);
542
543 add_last_status(env, "resultIsNull", object);
544
545 return object;
546 }
547
TestGetProperty(napi_env env,napi_callback_info info)548 static napi_value TestGetProperty(napi_env env,
549 napi_callback_info info) {
550 napi_status status;
551 napi_value object, key, result;
552
553 NODE_API_CALL(env, napi_create_object(env, &object));
554
555 NODE_API_CALL(env, napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, &key));
556
557 NODE_API_CALL(env, napi_create_object(env, &result));
558
559 status = napi_get_property(NULL, object, key, &result);
560
561 add_returned_status(env,
562 "envIsNull",
563 object,
564 "Invalid argument",
565 napi_invalid_arg,
566 status);
567
568 napi_get_property(env, NULL, key, &result);
569
570 add_last_status(env, "objectIsNull", object);
571
572 napi_get_property(env, object, NULL, &result);
573
574 add_last_status(env, "keyIsNull", object);
575
576 napi_get_property(env, object, key, NULL);
577
578 add_last_status(env, "resultIsNull", object);
579
580 return object;
581 }
582
TestFreeze(napi_env env,napi_callback_info info)583 static napi_value TestFreeze(napi_env env,
584 napi_callback_info info) {
585 size_t argc = 1;
586 napi_value args[1];
587 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
588
589 napi_value object = args[0];
590 NODE_API_CALL(env, napi_object_freeze(env, object));
591
592 return object;
593 }
594
TestSeal(napi_env env,napi_callback_info info)595 static napi_value TestSeal(napi_env env,
596 napi_callback_info info) {
597 size_t argc = 1;
598 napi_value args[1];
599 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
600
601 napi_value object = args[0];
602 NODE_API_CALL(env, napi_object_seal(env, object));
603
604 return object;
605 }
606
607 // We create two type tags. They are basically 128-bit UUIDs.
608 #define TYPE_TAG_COUNT 5
609 static const napi_type_tag type_tags[TYPE_TAG_COUNT] = {
610 {0xdaf987b3cc62481a, 0xb745b0497f299531},
611 {0xbb7936c374084d9b, 0xa9548d0762eeedb9},
612 {0xa5ed9ce2e4c00c38, 0},
613 {0, 0},
614 {0xa5ed9ce2e4c00c38, 0xdaf987b3cc62481a},
615 };
616 #define VALIDATE_TYPE_INDEX(env, type_index) \
617 do { \
618 if ((type_index) >= TYPE_TAG_COUNT) { \
619 NODE_API_CALL((env), \
620 napi_throw_range_error((env), \
621 "NODE_API_TEST_INVALID_TYPE_INDEX", \
622 "Invalid type index")); \
623 } \
624 } while (0)
625
626 static napi_value
TypeTaggedInstance(napi_env env,napi_callback_info info)627 TypeTaggedInstance(napi_env env, napi_callback_info info) {
628 size_t argc = 1;
629 uint32_t type_index;
630 napi_value instance, which_type;
631
632 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, &which_type, NULL, NULL));
633 NODE_API_CALL(env, napi_get_value_uint32(env, which_type, &type_index));
634 VALIDATE_TYPE_INDEX(env, type_index);
635 NODE_API_CALL(env, napi_create_object(env, &instance));
636 NODE_API_CALL(env, napi_type_tag_object(env, instance, &type_tags[type_index]));
637
638 return instance;
639 }
640
641 // V8 will not allowe us to construct an external with a NULL data value.
642 #define IN_LIEU_OF_NULL ((void*)0x1)
643
PlainExternal(napi_env env,napi_callback_info info)644 static napi_value PlainExternal(napi_env env, napi_callback_info info) {
645 napi_value instance;
646
647 NODE_API_CALL(
648 env, napi_create_external(env, IN_LIEU_OF_NULL, NULL, NULL, &instance));
649
650 return instance;
651 }
652
TypeTaggedExternal(napi_env env,napi_callback_info info)653 static napi_value TypeTaggedExternal(napi_env env, napi_callback_info info) {
654 size_t argc = 1;
655 uint32_t type_index;
656 napi_value instance, which_type;
657
658 NODE_API_CALL(env,
659 napi_get_cb_info(env, info, &argc, &which_type, NULL, NULL));
660 NODE_API_CALL(env, napi_get_value_uint32(env, which_type, &type_index));
661 VALIDATE_TYPE_INDEX(env, type_index);
662 NODE_API_CALL(
663 env, napi_create_external(env, IN_LIEU_OF_NULL, NULL, NULL, &instance));
664 NODE_API_CALL(env,
665 napi_type_tag_object(env, instance, &type_tags[type_index]));
666
667 return instance;
668 }
669
670 static napi_value
CheckTypeTag(napi_env env,napi_callback_info info)671 CheckTypeTag(napi_env env, napi_callback_info info) {
672 size_t argc = 2;
673 bool result;
674 napi_value argv[2], js_result;
675 uint32_t type_index;
676
677 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
678 NODE_API_CALL(env, napi_get_value_uint32(env, argv[0], &type_index));
679 VALIDATE_TYPE_INDEX(env, type_index);
680 NODE_API_CALL(env, napi_check_object_type_tag(env,
681 argv[1],
682 &type_tags[type_index],
683 &result));
684 NODE_API_CALL(env, napi_get_boolean(env, result, &js_result));
685
686 return js_result;
687 }
688
689 EXTERN_C_START
Init(napi_env env,napi_value exports)690 napi_value Init(napi_env env, napi_value exports) {
691 napi_property_descriptor descriptors[] = {
692 DECLARE_NODE_API_PROPERTY("Get", Get),
693 DECLARE_NODE_API_PROPERTY("GetNamed", GetNamed),
694 DECLARE_NODE_API_PROPERTY("GetPropertyNames", GetPropertyNames),
695 DECLARE_NODE_API_PROPERTY("GetSymbolNames", GetSymbolNames),
696 DECLARE_NODE_API_PROPERTY("GetEnumerableWritableNames",
697 GetEnumerableWritableNames),
698 DECLARE_NODE_API_PROPERTY("GetOwnWritableNames", GetOwnWritableNames),
699 DECLARE_NODE_API_PROPERTY("GetEnumerableConfigurableNames",
700 GetEnumerableConfigurableNames),
701 DECLARE_NODE_API_PROPERTY("GetOwnConfigurableNames",
702 GetOwnConfigurableNames),
703 DECLARE_NODE_API_PROPERTY("Set", Set),
704 DECLARE_NODE_API_PROPERTY("SetNamed", SetNamed),
705 DECLARE_NODE_API_PROPERTY("Has", Has),
706 DECLARE_NODE_API_PROPERTY("HasNamed", HasNamed),
707 DECLARE_NODE_API_PROPERTY("HasOwn", HasOwn),
708 DECLARE_NODE_API_PROPERTY("Delete", Delete),
709 DECLARE_NODE_API_PROPERTY("New", New),
710 DECLARE_NODE_API_PROPERTY("Inflate", Inflate),
711 DECLARE_NODE_API_PROPERTY("Wrap", Wrap),
712 DECLARE_NODE_API_PROPERTY("Unwrap", Unwrap),
713 DECLARE_NODE_API_PROPERTY("TestSetProperty", TestSetProperty),
714 DECLARE_NODE_API_PROPERTY("TestHasProperty", TestHasProperty),
715 DECLARE_NODE_API_PROPERTY("TypeTaggedInstance", TypeTaggedInstance),
716 DECLARE_NODE_API_PROPERTY("TypeTaggedExternal", TypeTaggedExternal),
717 DECLARE_NODE_API_PROPERTY("PlainExternal", PlainExternal),
718 DECLARE_NODE_API_PROPERTY("CheckTypeTag", CheckTypeTag),
719 DECLARE_NODE_API_PROPERTY("TestGetProperty", TestGetProperty),
720 DECLARE_NODE_API_PROPERTY("TestFreeze", TestFreeze),
721 DECLARE_NODE_API_PROPERTY("TestSeal", TestSeal),
722 };
723
724 init_test_null(env, exports);
725
726 NODE_API_CALL(env, napi_define_properties(
727 env, exports, sizeof(descriptors) / sizeof(*descriptors), descriptors));
728
729 return exports;
730 }
731 EXTERN_C_END
732