From b203b9ddacc269aec684f642de5d0e4e2de9de73 Mon Sep 17 00:00:00 2001 From: Daeyeon Jeong Date: Tue, 12 Jul 2022 13:38:15 +0900 Subject: [PATCH] src: fix `napi_check_object_type_tag()` This fixes a comparison failure occurring when the upper value of a type tag is 0, or a type tag value is 0. Signed-off-by: Daeyeon Jeong daeyeon.dev@gmail.com --- src/js_native_api_v8.cc | 12 ++++++++++-- test/js-native-api/test_object/test.js | 4 ++++ test/js-native-api/test_object/test_object.c | 8 +++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 0ddbc87e45393e..b538c729bc77aa 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -2452,8 +2452,16 @@ napi_status NAPI_CDECL napi_check_object_type_tag(napi_env env, napi_type_tag tag; val.As()->ToWordsArray( &sign, &size, reinterpret_cast(&tag)); - if (size == 2 && sign == 0) - *result = (tag.lower == type_tag->lower && tag.upper == type_tag->upper); + if (sign == 0) { + if (size == 2) { + *result = + (tag.lower == type_tag->lower && tag.upper == type_tag->upper); + } else if (size == 1) { + *result = (tag.lower == type_tag->lower); + } else if (size == 0) { + *result = (type_tag->lower == 0 && type_tag->upper == 0); + } + } } return GET_RETURN_STATUS(env); diff --git a/test/js-native-api/test_object/test.js b/test/js-native-api/test_object/test.js index 021f45b55f407a..06aaff275e7281 100644 --- a/test/js-native-api/test_object/test.js +++ b/test/js-native-api/test_object/test.js @@ -163,10 +163,14 @@ assert.strictEqual(newObject.test_string, 'test string'); // Verify that objects can be type-tagged and type-tag-checked. const obj1 = test_object.TypeTaggedInstance(0); const obj2 = test_object.TypeTaggedInstance(1); + const obj3 = test_object.TypeTaggedInstance(2); + const obj4 = test_object.TypeTaggedInstance(3); // Verify that type tags are correctly accepted. assert.strictEqual(test_object.CheckTypeTag(0, obj1), true); assert.strictEqual(test_object.CheckTypeTag(1, obj2), true); + assert.strictEqual(test_object.CheckTypeTag(2, obj3), true); + assert.strictEqual(test_object.CheckTypeTag(3, obj4), true); // Verify that wrongly tagged objects are rejected. assert.strictEqual(test_object.CheckTypeTag(0, obj2), false); diff --git a/test/js-native-api/test_object/test_object.c b/test/js-native-api/test_object/test_object.c index 46a99a1e9ee1ed..a8836ee0d51402 100644 --- a/test/js-native-api/test_object/test_object.c +++ b/test/js-native-api/test_object/test_object.c @@ -605,9 +605,11 @@ static napi_value TestSeal(napi_env env, } // We create two type tags. They are basically 128-bit UUIDs. -static const napi_type_tag type_tags[2] = { - { 0xdaf987b3cc62481a, 0xb745b0497f299531 }, - { 0xbb7936c374084d9b, 0xa9548d0762eeedb9 } +static const napi_type_tag type_tags[5] = { + {0xdaf987b3cc62481a, 0xb745b0497f299531}, + {0xbb7936c374084d9b, 0xa9548d0762eeedb9}, + {0xa5ed9ce2e4c00c38, 0x0}, + {0x0, 0x0}, }; static napi_value