@@ -605,13 +605,23 @@ static napi_value TestSeal(napi_env env,
605
605
}
606
606
607
607
// We create two type tags. They are basically 128-bit UUIDs.
608
- static const napi_type_tag type_tags [5 ] = {
609
- { 0xdaf987b3cc62481a , 0xb745b0497f299531 },
610
- { 0xbb7936c374084d9b , 0xa9548d0762eeedb9 },
611
- { 0xa5ed9ce2e4c00c38 , 0 },
612
- { 0 , 0 },
613
- { 0xa5ed9ce2e4c00c38 , 0xdaf987b3cc62481a },
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 },
614
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)
615
625
616
626
static napi_value
617
627
TypeTaggedInstance (napi_env env , napi_callback_info info ) {
@@ -621,12 +631,42 @@ TypeTaggedInstance(napi_env env, napi_callback_info info) {
621
631
622
632
NODE_API_CALL (env , napi_get_cb_info (env , info , & argc , & which_type , NULL , NULL ));
623
633
NODE_API_CALL (env , napi_get_value_uint32 (env , which_type , & type_index ));
634
+ VALIDATE_TYPE_INDEX (env , type_index );
624
635
NODE_API_CALL (env , napi_create_object (env , & instance ));
625
636
NODE_API_CALL (env , napi_type_tag_object (env , instance , & type_tags [type_index ]));
626
637
627
638
return instance ;
628
639
}
629
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
+
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
+
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
+
630
670
static napi_value
631
671
CheckTypeTag (napi_env env , napi_callback_info info ) {
632
672
size_t argc = 2 ;
@@ -636,6 +676,7 @@ CheckTypeTag(napi_env env, napi_callback_info info) {
636
676
637
677
NODE_API_CALL (env , napi_get_cb_info (env , info , & argc , argv , NULL , NULL ));
638
678
NODE_API_CALL (env , napi_get_value_uint32 (env , argv [0 ], & type_index ));
679
+ VALIDATE_TYPE_INDEX (env , type_index );
639
680
NODE_API_CALL (env , napi_check_object_type_tag (env ,
640
681
argv [1 ],
641
682
& type_tags [type_index ],
@@ -648,31 +689,36 @@ CheckTypeTag(napi_env env, napi_callback_info info) {
648
689
EXTERN_C_START
649
690
napi_value Init (napi_env env , napi_value exports ) {
650
691
napi_property_descriptor descriptors [] = {
651
- DECLARE_NODE_API_PROPERTY ("Get" , Get ),
652
- DECLARE_NODE_API_PROPERTY ("GetNamed" , GetNamed ),
653
- DECLARE_NODE_API_PROPERTY ("GetPropertyNames" , GetPropertyNames ),
654
- DECLARE_NODE_API_PROPERTY ("GetSymbolNames" , GetSymbolNames ),
655
- DECLARE_NODE_API_PROPERTY ("GetEnumerableWritableNames" , GetEnumerableWritableNames ),
656
- DECLARE_NODE_API_PROPERTY ("GetOwnWritableNames" , GetOwnWritableNames ),
657
- DECLARE_NODE_API_PROPERTY ("GetEnumerableConfigurableNames" , GetEnumerableConfigurableNames ),
658
- DECLARE_NODE_API_PROPERTY ("GetOwnConfigurableNames" , GetOwnConfigurableNames ),
659
- DECLARE_NODE_API_PROPERTY ("Set" , Set ),
660
- DECLARE_NODE_API_PROPERTY ("SetNamed" , SetNamed ),
661
- DECLARE_NODE_API_PROPERTY ("Has" , Has ),
662
- DECLARE_NODE_API_PROPERTY ("HasNamed" , HasNamed ),
663
- DECLARE_NODE_API_PROPERTY ("HasOwn" , HasOwn ),
664
- DECLARE_NODE_API_PROPERTY ("Delete" , Delete ),
665
- DECLARE_NODE_API_PROPERTY ("New" , New ),
666
- DECLARE_NODE_API_PROPERTY ("Inflate" , Inflate ),
667
- DECLARE_NODE_API_PROPERTY ("Wrap" , Wrap ),
668
- DECLARE_NODE_API_PROPERTY ("Unwrap" , Unwrap ),
669
- DECLARE_NODE_API_PROPERTY ("TestSetProperty" , TestSetProperty ),
670
- DECLARE_NODE_API_PROPERTY ("TestHasProperty" , TestHasProperty ),
671
- DECLARE_NODE_API_PROPERTY ("TypeTaggedInstance" , TypeTaggedInstance ),
672
- DECLARE_NODE_API_PROPERTY ("CheckTypeTag" , CheckTypeTag ),
673
- DECLARE_NODE_API_PROPERTY ("TestGetProperty" , TestGetProperty ),
674
- DECLARE_NODE_API_PROPERTY ("TestFreeze" , TestFreeze ),
675
- DECLARE_NODE_API_PROPERTY ("TestSeal" , TestSeal ),
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 ),
676
722
};
677
723
678
724
init_test_null (env , exports );
0 commit comments