Skip to content

Add BigInt Type Support for Turbo Module Code Generation (#56016)#56016

Open
christophpurrer wants to merge 2 commits intofacebook:mainfrom
christophpurrer:export-D95232267
Open

Add BigInt Type Support for Turbo Module Code Generation (#56016)#56016
christophpurrer wants to merge 2 commits intofacebook:mainfrom
christophpurrer:export-D95232267

Conversation

@christophpurrer
Copy link
Contributor

@christophpurrer christophpurrer commented Mar 9, 2026

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:

export interface Spec extends TurboModule {
  +getBigInt: (arg: bigint) => bigint;
}

Changelog: [General][Added] - Add BigInt Type Support for Turbo Module Code Generation

Differential Revision: D95232267

@meta-cla meta-cla bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Mar 9, 2026
@meta-codesync
Copy link

meta-codesync bot commented Mar 9, 2026

@christophpurrer has exported this pull request. If you are a Meta employee, you can view the originating Diff in D95232267.

christophpurrer added a commit to christophpurrer/react-native-macos that referenced this pull request Mar 10, 2026
)

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
christophpurrer added a commit to christophpurrer/react-native-macos that referenced this pull request Mar 10, 2026
)

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:
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
@meta-codesync meta-codesync bot changed the title Add BigInt Type Support for Turbo Module Code Generation Add BigInt Type Support for Turbo Module Code Generation (#56016) Mar 17, 2026
christophpurrer added a commit to christophpurrer/react-native-macos that referenced this pull request Mar 17, 2026
)

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
christophpurrer added a commit to christophpurrer/react-native-macos that referenced this pull request Mar 17, 2026
)

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:
Pull Request resolved: facebook#56016

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported meta-exported p: Facebook Partner: Facebook Partner

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants