• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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