@@ -605,13 +605,23 @@ static napi_value TestSeal(napi_env env,
605605}
606606
607607// 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 },
614615};
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)
615625
616626static napi_value
617627TypeTaggedInstance (napi_env env , napi_callback_info info ) {
@@ -621,12 +631,42 @@ TypeTaggedInstance(napi_env env, napi_callback_info info) {
621631
622632 NODE_API_CALL (env , napi_get_cb_info (env , info , & argc , & which_type , NULL , NULL ));
623633 NODE_API_CALL (env , napi_get_value_uint32 (env , which_type , & type_index ));
634+ VALIDATE_TYPE_INDEX (env , type_index );
624635 NODE_API_CALL (env , napi_create_object (env , & instance ));
625636 NODE_API_CALL (env , napi_type_tag_object (env , instance , & type_tags [type_index ]));
626637
627638 return instance ;
628639}
629640
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+
630670static napi_value
631671CheckTypeTag (napi_env env , napi_callback_info info ) {
632672 size_t argc = 2 ;
@@ -636,6 +676,7 @@ CheckTypeTag(napi_env env, napi_callback_info info) {
636676
637677 NODE_API_CALL (env , napi_get_cb_info (env , info , & argc , argv , NULL , NULL ));
638678 NODE_API_CALL (env , napi_get_value_uint32 (env , argv [0 ], & type_index ));
679+ VALIDATE_TYPE_INDEX (env , type_index );
639680 NODE_API_CALL (env , napi_check_object_type_tag (env ,
640681 argv [1 ],
641682 & type_tags [type_index ],
@@ -648,31 +689,36 @@ CheckTypeTag(napi_env env, napi_callback_info info) {
648689EXTERN_C_START
649690napi_value Init (napi_env env , napi_value exports ) {
650691 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 ),
676722 };
677723
678724 init_test_null (env , exports );
0 commit comments