Add BigInt Support to Objective-C Turbo Module (#56020)#56020
Open
christophpurrer wants to merge 5 commits intofacebook:mainfrom
Open
Add BigInt Support to Objective-C Turbo Module (#56020)#56020christophpurrer wants to merge 5 commits intofacebook:mainfrom
christophpurrer wants to merge 5 commits intofacebook:mainfrom
Conversation
|
@christophpurrer has exported this pull request. If you are a Meta employee, you can view the originating Diff in D95232266. |
103dac6 to
963e33b
Compare
christophpurrer
added a commit
to christophpurrer/react-native-macos
that referenced
this pull request
Mar 10, 2026
Summary: Pull Request resolved: facebook#56020 This diff adds BigInt method support to the Objective-C sample Turbo Module, demonstrating how to use 64-bit integers with BigInt bridging on iOS. Changes: - Added getBigInt method declaration in RCTNativeSampleTurboModuleSpec.h using C++ int64_t type - Added host function binding in RCTNativeSampleTurboModuleSpec.mm using BigIntKind - Implemented getBigInt in RCTSampleTurboModule.mm using RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD - Fixed BigInt rendering in NativeCxxModuleExampleExample.js and SampleTurboModuleExample.js — JSON.stringify() cannot serialize BigInt, so bigint values are now rendered via .toString() The ObjC bridge maps getBigInt to an NSNumber* return with BigIntKind, which instructs the TurboModule infrastructure to convert via jsi::BigInt::fromInt64(). ## Conversion Table | NSNumber Method | Underlying Type | Min | Max | | --- | --- | --- | --- | | numberWithChar: | char | -128 | 127 | | numberWithShort: | short | -32,768 | 32,767 | | numberWithInt: | int | -2,147,483,648 | 2,147,483,647 | | numberWithLongLong: | long long | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | | numberWithUnsignedLongLong: | unsigned long long | 0 | 18,446,744,073,709,551,615 | Changelog: [iOS][Added] - Add BigInt Support to Objective-C Turbo Module Differential Revision: D95232266
christophpurrer
added a commit
to christophpurrer/react-native-macos
that referenced
this pull request
Mar 17, 2026
Summary: Pull Request resolved: facebook#56020 This diff adds BigInt method support to the Objective-C sample Turbo Module, demonstrating how to use 64-bit integers with BigInt bridging on iOS. Changes: - Added getBigInt method declaration in RCTNativeSampleTurboModuleSpec.h using C++ int64_t type - Added host function binding in RCTNativeSampleTurboModuleSpec.mm using BigIntKind - Implemented getBigInt in RCTSampleTurboModule.mm using RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD - Fixed BigInt rendering in NativeCxxModuleExampleExample.js and SampleTurboModuleExample.js — JSON.stringify() cannot serialize BigInt, so bigint values are now rendered via .toString() The ObjC bridge maps getBigInt to an NSNumber* return with BigIntKind, which instructs the TurboModule infrastructure to convert via jsi::BigInt::fromInt64(). ## Conversion Table | NSNumber Method | Underlying Type | Min | Max | | --- | --- | --- | --- | | numberWithChar: | char | -128 | 127 | | numberWithShort: | short | -32,768 | 32,767 | | numberWithInt: | int | -2,147,483,648 | 2,147,483,647 | | numberWithLongLong: | long long | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | | numberWithUnsignedLongLong: | unsigned long long | 0 | 18,446,744,073,709,551,615 | Changelog: [iOS][Added] - Add BigInt Support to Objective-C Turbo Module Differential Revision: D95232266
963e33b to
4e048fa
Compare
Summary: Pull Request resolved: facebook#56008 This diff adds native BigInt bridging support to React Native's C++ bridging layer. BigInt is a JavaScript primitive that represents integers with arbitrary precision, enabling safe handling of 64-bit integers that exceed JavaScript's Number.MAX_SAFE_INTEGER (2^53-1). This implementation introduces a `facebook::react::BigInt` C++ wrapper class that internally stores values as `std::variant<int64_t, uint64_t>`, preserving signedness. The wrapper is constructed from `jsi::BigInt` (checking `isInt64()`/`isUint64()` for lossless conversion) and provides `toJSBigInt()` for the reverse direction. A `Bridging<BigInt>` template specialization converts between `jsi::Value` and `facebook::react::BigInt`, enabling seamless use in Turbo Module method signatures. Example usage: ```cpp // In your Turbo Module BigInt getBigInt(jsi::Runtime &rt, BigInt arg) { return arg; // Receives BigInt from JS, returns BigInt to JS } ``` ```javascript // In JavaScript const result = nativeModule.getBigInt(BigInt('9223372036854775807')); ``` ## Hey, wait a moment .... Why are we not simply bridging like this: ``` struct Bridging<int64_t> { ``` or ``` struct Bridging<uint64_t> { ``` ?????? Reason: It is very likely that custom implementations are already present in many RN apps > See: https://reactnative.dev/docs/the-new-architecture/custom-cxx-types ``` template <> struct Bridging<int64_t> { // Converts from the JS representation to the C++ representation static int64_t fromJs(jsi::Runtime &rt, const jsi::String &value) { try { size_t pos; auto str = value.utf8(rt); auto num = std::stoll(str, &pos); if (pos != str.size()) { throw std::invalid_argument("Invalid number"); // don't support alphanumeric strings } return num; } catch (const std::logic_error &e) { throw jsi::JSError(rt, e.what()); } } // Converts from the C++ representation to the JS representation static jsi::String toJs(jsi::Runtime &rt, int64_t value) { return bridging::toJs(rt, std::to_string(value)); } }; ``` Changelog: [General][Added] - Add BigInt bridging support for Turbo Modules Differential Revision: D95706781
Summary:
This diff extends the React Native codegen to support BigIntTypeAnnotation.
This type enables Turbo Modules to handle 64-bit integers safely by using
JavaScript BigInt on the JS side and `facebook::react::BigInt` on native C++
platforms (with Java `long` for Android JNI).
Changes:
- Added BigIntTypeAnnotation to CodegenSchema.js
- Added emitBigInt parser function in parsers-primitives.js
- Added TSBigIntKeyword mapping in TypeScript parser
- Updated GenerateModuleH.js for C++ header generation with `BigInt` param/return
type and `jsi::BigInt` callFromJs return type
- Updated GenerateModuleJavaSpec.js — BigInt maps to 'long' for JNI params
but throws "not supported" for Java spec generation (not yet supported)
- Updated GenerateModuleJniCpp.js with BigIntKind return type
- Updated Objective-C generators: serializeMethod.js, StructCollector.js,
serializeConstantsStruct.js, serializeRegularStruct.js
- Updated compatibility check: ErrorFormatting.js, SortTypeAnnotations.js,
TypeDiffing.js
Example Turbo Module definition:
```javascript
export interface Spec extends TurboModule {
+getBigInt: (arg: bigint) => bigint;
}
```
Changelog: [General][Added] - Add BigInt Type Support for Turbo Module Code Generation
Differential Revision: D95232267
Summary:
This diff adds BigInt method support to the C++ sample Turbo Module (NativeCxxModuleExample),
demonstrating how to use `facebook::react::BigInt` with the bridging layer.
Changes:
- Added getBigInt method to NativeCxxModuleExample.cpp/.h using
`facebook::react::BigInt` as the C++ type
- Added getBigInt to NativeCxxModuleExample.js spec
- Added BigIntKind to TurboModule.h for the method dispatch infrastructure
- Updated RCTTurboModule.mm to handle BigIntKind in the iOS TurboModule bridge
- Fixed BigInt rendering in NativeCxxModuleExampleExample.js — JSON.stringify()
cannot serialize BigInt, so bigint values are now rendered via .toString()
The `facebook::react::BigInt` wrapper class (introduced in the bridging diff)
stores values as `std::variant<int64_t, uint64_t>`, preserving signedness.
The `Bridging<BigInt>` specialization handles conversion to/from `jsi::BigInt`.
Example:
```cpp
BigInt NativeCxxModuleExample::getBigInt(jsi::Runtime& rt, BigInt arg) {
return arg;
}
```
Changelog: [General][Added] - Add BigInt bridging support for Turbo Modules
Differential Revision: D95232265
Summary:
This diff adds a getBigInt method to the Java/Kotlin sample Turbo Module,
demonstrating how to use JavaScript BigInt with BigInt bridging on Android.
Changes:
- Updated NativeSampleTurboModule.js with getBigInt method declaration
- Added getBigInt Java method in NativeSampleTurboModuleSpec.java
- Implemented getBigInt in SampleTurboModule.kt using Kotlin's Long type
- Added getBigInt test case in SampleTurboModuleExample.js
On the C++ side, `facebook::react::BigInt` is used as the bridging type.
The Java/JNI layer maps this to Java's `long` type (64-bit signed integer).
JavaScript BigInt values are automatically bridged to/from Java long via the
BigIntKind return type in the JNI bindings.
Example:
```java
// Java spec (hand-written, codegen not yet supported for BigInt)
DoNotStrip
public long getBigInt(long arg) { return 0; }
```
```kotlin
// Kotlin implementation
override fun getBigInt(arg: Long): Long = arg
```
Changelog: [Android][Added] - Add BigInt Support to Java Turbo Module
Differential Revision: D95232272
Summary: Pull Request resolved: facebook#56020 This diff adds BigInt method support to the Objective-C sample Turbo Module, demonstrating how to use 64-bit integers with BigInt bridging on iOS. Changes: - Added getBigInt method declaration in RCTNativeSampleTurboModuleSpec.h using C++ int64_t type - Added host function binding in RCTNativeSampleTurboModuleSpec.mm using BigIntKind - Implemented getBigInt in RCTSampleTurboModule.mm using RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD - Fixed BigInt rendering in NativeCxxModuleExampleExample.js and SampleTurboModuleExample.js — JSON.stringify() cannot serialize BigInt, so bigint values are now rendered via .toString() The ObjC bridge maps getBigInt to an NSNumber* return with BigIntKind, which instructs the TurboModule infrastructure to convert via jsi::BigInt::fromInt64(). ## Conversion Table | NSNumber Method | Underlying Type | Min | Max | | --- | --- | --- | --- | | numberWithChar: | char | -128 | 127 | | numberWithShort: | short | -32,768 | 32,767 | | numberWithInt: | int | -2,147,483,648 | 2,147,483,647 | | numberWithLongLong: | long long | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | | numberWithUnsignedLongLong: | unsigned long long | 0 | 18,446,744,073,709,551,615 | Changelog: [iOS][Added] - Add BigInt Support to Objective-C Turbo Module Differential Revision: D95232266
4e048fa to
48166fa
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary:
This diff adds BigInt method support to the Objective-C sample Turbo Module,
demonstrating how to use 64-bit integers with BigInt bridging on iOS.
Changes:
using C++ int64_t type
RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD
SampleTurboModuleExample.js — JSON.stringify() cannot serialize BigInt,
so bigint values are now rendered via .toString()
The ObjC bridge maps getBigInt to an NSNumber* return with BigIntKind, which
instructs the TurboModule infrastructure to convert via
jsi::BigInt::fromInt64().
Conversion Table
Changelog: [iOS][Added] - Add BigInt Support to Objective-C Turbo Module
Differential Revision: D95232266