From 0ac879e2cbe20fec5c4eb3acc5910b5da159ec90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Wed, 19 Apr 2023 14:36:47 +0200 Subject: [PATCH 1/5] Using asSigned instead of int64_t --- packages/bindgen/src/realm_js_helpers.h | 8 ++++++++ packages/bindgen/src/templates/jsi.ts | 8 ++++---- packages/bindgen/src/templates/node.ts | 4 ++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/bindgen/src/realm_js_helpers.h b/packages/bindgen/src/realm_js_helpers.h index 9cd05af0d2..f01b1f0e6b 100644 --- a/packages/bindgen/src/realm_js_helpers.h +++ b/packages/bindgen/src/realm_js_helpers.h @@ -368,5 +368,13 @@ auto schedulerWrapBlockingFunction(F&& f) }; } +/** + * Helps with correct handling of -1/npos for count_t + */ +template +auto asSigned(T num) { + return std::make_signed_t(num); +} + } // namespace } // namespace realm::js diff --git a/packages/bindgen/src/templates/jsi.ts b/packages/bindgen/src/templates/jsi.ts index a358eed509..1fc44b1451 100644 --- a/packages/bindgen/src/templates/jsi.ts +++ b/packages/bindgen/src/templates/jsi.ts @@ -227,8 +227,8 @@ function convertPrimToJsi(addon: JsiAddon, type: string, expr: string): string { return `jsi::Value(double(${expr}))`; case "count_t": - // NOTE: using int64_t cast here to get -1.0 for size_t(-1), aka npos. - return `jsi::Value(double(int64_t(${expr})))`; + // NOTE: using asSigned() here to get -1.0 for size_t(-1), aka npos. + return `jsi::Value(double(asSigned(${expr})))`; case "int64_t": return `bigIntFromI64(_env, ${expr})`; @@ -317,8 +317,8 @@ function convertPrimFromJsi(addon: JsiAddon, type: string, expr: string): string return `int32_t((${expr}).asNumber())`; case "count_t": - // NOTE: using int64_t here is important to correctly handle -1.0 aka npos. - return `size_t(int64_t((${expr}).asNumber()))`; + // NOTE: using size_t here is important to correctly handle -1.0 aka npos. + return `size_t(std::size_t((${expr}).asNumber()))`; case "int64_t": return `bigIntToI64(_env, jsi::Value(_env, ${expr}))`; diff --git a/packages/bindgen/src/templates/node.ts b/packages/bindgen/src/templates/node.ts index 7329464a5e..154bab08ab 100644 --- a/packages/bindgen/src/templates/node.ts +++ b/packages/bindgen/src/templates/node.ts @@ -180,8 +180,8 @@ function convertPrimToNode(addon: NodeAddon, type: string, expr: string): string return `Napi::Number::New(${env}, ${expr})`; case "count_t": - // NOTE: using int64_t cast here to get -1.0 for size_t(-1), aka npos. - return `Napi::Number::New(${env}, int64_t(${expr}))`; + // NOTE: using asSigned() here to get -1.0 for size_t(-1), aka npos. + return `Napi::Number::New(${env}, asSigned(${expr}))`; case "int64_t": case "uint64_t": From 6dd0c276a44cc51d6ffda781acf6267bda2beb69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Wed, 19 Apr 2023 16:52:46 +0200 Subject: [PATCH 2/5] Ran clang-format [skip ci] --- packages/bindgen/src/realm_js_helpers.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/bindgen/src/realm_js_helpers.h b/packages/bindgen/src/realm_js_helpers.h index f01b1f0e6b..794502ff42 100644 --- a/packages/bindgen/src/realm_js_helpers.h +++ b/packages/bindgen/src/realm_js_helpers.h @@ -372,7 +372,8 @@ auto schedulerWrapBlockingFunction(F&& f) * Helps with correct handling of -1/npos for count_t */ template -auto asSigned(T num) { +auto asSigned(T num) +{ return std::make_signed_t(num); } From 78673f6d9f37ff7b337b9eca4dbf31ec8490ba35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Thu, 20 Apr 2023 08:54:27 +0200 Subject: [PATCH 3/5] Using ptrdiff_t instead of std::size_t --- packages/bindgen/src/templates/jsi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bindgen/src/templates/jsi.ts b/packages/bindgen/src/templates/jsi.ts index 1fc44b1451..2b0692f3c7 100644 --- a/packages/bindgen/src/templates/jsi.ts +++ b/packages/bindgen/src/templates/jsi.ts @@ -318,7 +318,7 @@ function convertPrimFromJsi(addon: JsiAddon, type: string, expr: string): string case "count_t": // NOTE: using size_t here is important to correctly handle -1.0 aka npos. - return `size_t(std::size_t((${expr}).asNumber()))`; + return `size_t(ptrdiff_t((${expr}).asNumber()))`; case "int64_t": return `bigIntToI64(_env, jsi::Value(_env, ${expr}))`; From 8106b0642fd17324a162414ebdcbbcdd24da874d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Thu, 20 Apr 2023 09:05:38 +0200 Subject: [PATCH 4/5] Adding a note to the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1fe1f2e1e..d795aff111 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * Fix a data race that could cause a reading thread to read from a no-longer-valid memory mapping ([realm/realm-core#6411](https://github.com/realm/realm-core/pull/6411), since v11.3.0-rc.0). * Fixed an issue that could cause a crash when performing count() on an undefined query. ([realm/realm-core#6443](https://github.com/realm/realm-core/issues/6443), since v12.0.0-alpha.2) * Added missing implementation of `User.state` and changed the `UserState` enum values to use pascal case to conform to the v11 implementation (except for `UserState.Active` that we now deprecate in favor of `UserState.LoggedIn`). [#5686](https://github.com/realm/realm-js/issues/5686) +* Getting the `indexOf` a missing value will no longer return `4294967295` instead of `-1` and the `Set#has` will no longer return `true` when missing. Caused by an incorrect conversion of `size_t` to `Number` on x86 (32bit) architectures. ([#5746](https://github.com/realm/realm-js/pull/5746), since 12.0.0-alpha.0) ### Compatibility * React Native >= v0.71.0 From 35a1d57a8c380b170e45e7f0ffebdb8cde079b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Fri, 21 Apr 2023 14:49:46 +0200 Subject: [PATCH 5/5] Update packages/bindgen/src/templates/jsi.ts [skip ci] Co-authored-by: Mathias Stearn --- packages/bindgen/src/templates/jsi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bindgen/src/templates/jsi.ts b/packages/bindgen/src/templates/jsi.ts index 2b0692f3c7..53bdf1a5e7 100644 --- a/packages/bindgen/src/templates/jsi.ts +++ b/packages/bindgen/src/templates/jsi.ts @@ -317,7 +317,7 @@ function convertPrimFromJsi(addon: JsiAddon, type: string, expr: string): string return `int32_t((${expr}).asNumber())`; case "count_t": - // NOTE: using size_t here is important to correctly handle -1.0 aka npos. + // NOTE: using ptrdiff_t here is important to correctly handle -1.0 aka npos. return `size_t(ptrdiff_t((${expr}).asNumber()))`; case "int64_t":