Skip to content

Commit 82af115

Browse files
christophpurrermeta-codesync[bot]
authored andcommitted
Change ArrayBuffer implementation from copyBuffer to moveBuffer
Summary: Switches the `jsi::ArrayBuffer ⇄ native byte buffer` bridge in TurboModules from a copy-based implementation (`OwnedMutableBuffer`) to a zero-copy borrow implementation (`BorrowedMutableBuffer`) on the paths where the caller can guarantee the source memory's lifetime, eliminating an O(N) copy on every ArrayBuffer that crosses the JS/native boundary. **`ReactCommon/react/bridging/ArrayBuffer.h`** — adds `BorrowedMutableBuffer`: holds a raw `uint8_t*` + size, plus an optional `std::function<void()>` release callback invoked from the destructor. Caller is responsible for keeping the underlying memory alive — typically by capturing a JNI `global_ref` or ARC-retained ObjC object in the release lambda. Non-copyable; documents thread-safety requirements (release may fire on the JS GC thread). `OwnedMutableBuffer` and the `Bridging<std::vector<uint8_t>>` specialization are preserved for paths where the source lifetime cannot be guaranteed. **Android — `JavaTurboModule.cpp`** — wraps the Java `ByteBuffer`'s direct memory in a `BorrowedMutableBuffer`. Pins the buffer with `jni::make_global(jByteBuffer)` and captures the global ref in the release lambda so Java GC cannot collect it while the JS ArrayBuffer is alive. Tightens the `Ljava/nio/ByteBuffer;` argument check from `isObject()` to `isObject() && isArrayBuffer()`. **iOS — `RCTTurboModule.mm`** — `convertJSIObjectToObjCObject` (sync arg path) returns `NSMutableData dataWithBytesNoCopy:length:freeWhenDone:NO` instead of copying via `[NSData dataWithBytes:length:]`. Safe because the JS ArrayBuffer outlives the synchronous call. `convertReturnIdToJSIValue` `ArrayBufferKind` (sync return path) wraps `NSMutableData.mutableBytes` with `BorrowedMutableBuffer`, retaining the `NSMutableData` via the block capture for the lifetime of the JS ArrayBuffer. `convertObjCObjectToJSIValue` (async/promise path) adds an `NSData → ArrayBuffer` branch that still copies via `OwnedMutableBuffer`, since the source NSData lifetime cannot be guaranteed past the async callback. **Codegen — `serializeMethod.js` + snapshot** — ObjC++ spec generator now emits `NSMutableData *` (instead of `NSData *`) for `ArrayBufferTypeAnnotation`, both for parameters and return types. Module authors must update their ObjC implementations. Changelog: [General][Changed] - TurboModule ArrayBuffer transfers between JS and native are now zero-copy where caller lifetime can be guaranteed; ObjC TurboModule specs now use `NSMutableData *` for `ArrayBufferTypeAnnotation` parameters and return types Differential Revision: D96034456
1 parent 9595355 commit 82af115

14 files changed

Lines changed: 175 additions & 151 deletions

File tree

packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ function getParamObjCType(
221221
return notStruct(wrapOptional('NSArray *', !nullable));
222222
}
223223
case 'ArrayBufferTypeAnnotation': {
224-
return notStruct(wrapOptional('NSData *', !nullable));
224+
return notStruct(wrapOptional('NSMutableData *', !nullable));
225225
}
226226
}
227227

@@ -392,7 +392,7 @@ function getReturnObjCType(
392392
case 'GenericObjectTypeAnnotation':
393393
return wrapOptional('NSDictionary *', isRequired);
394394
case 'ArrayBufferTypeAnnotation':
395-
return wrapOptional('NSData *', isRequired);
395+
return wrapOptional('NSMutableData *', isRequired);
396396
default:
397397
typeAnnotation.type as 'MixedTypeAnnotation';
398398
throw new Error(

packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ Map {
102102
103103
@protocol NativeSampleTurboModuleSpec <RCTBridgeModule, RCTTurboModule>
104104
105-
- (NSData *)getArrayBuffer:(NSData *)buffer;
106-
- (void)saveData:(NSData *)data;
107-
- (NSData * _Nullable)loadData;
105+
- (NSMutableData *)getArrayBuffer:(NSMutableData *)buffer;
106+
- (void)saveData:(NSMutableData *)data;
107+
- (NSMutableData * _Nullable)loadData;
108108
109109
@end
110110

packages/react-native/ReactCommon/react/bridging/ArrayBuffer.h

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,55 +10,60 @@
1010
#include <react/bridging/Base.h>
1111

1212
#include <cstring>
13+
#include <functional>
1314
#include <iterator>
1415
#include <vector>
1516

1617
namespace facebook::react {
1718

1819
/**
19-
* A concrete implementation of jsi::MutableBuffer that owns a copy of the data.
20-
* Used when creating jsi::ArrayBuffer from native data (e.g., NSData,
21-
* ByteBuffer) where we need to copy the data to ensure proper memory
22-
* ownership.
20+
* A non-owning implementation of jsi::MutableBuffer that borrows a pointer to
21+
* externally-managed memory. The caller MUST ensure the underlying data outlives
22+
* the buffer, or provide a release callback that prevents the source from being
23+
* deallocated (e.g., a JNI global_ref or an ARC-retained ObjC object).
24+
*
25+
* When the BorrowedMutableBuffer is destroyed, the optional release callback is
26+
* invoked, allowing the prevent-GC reference to be dropped.
27+
*
28+
* Thread safety: The release callback may be invoked on any thread (typically
29+
* the JS thread during garbage collection). Callers must ensure the release
30+
* callback is safe to invoke from any thread. JNI DeleteGlobalRef and ARC
31+
* release are both thread-safe.
32+
*
33+
* The release callback must not throw exceptions. Throwing from the destructor
34+
* will terminate the process.
2335
*/
24-
class OwnedMutableBuffer : public jsi::MutableBuffer {
36+
class BorrowedMutableBuffer : public jsi::MutableBuffer {
2537
public:
26-
OwnedMutableBuffer(const uint8_t *data, size_t size) : data_(data, std::next(data, static_cast<std::ptrdiff_t>(size)))
38+
BorrowedMutableBuffer(uint8_t *data, size_t size, std::function<void()> release = nullptr)
39+
: data_(data), size_(size), release_(std::move(release))
2740
{
2841
}
2942

30-
explicit OwnedMutableBuffer(size_t size) : data_(size, 0) {}
43+
~BorrowedMutableBuffer() override
44+
{
45+
if (release_) {
46+
release_();
47+
}
48+
}
3149

32-
explicit OwnedMutableBuffer(std::vector<uint8_t> data) : data_(std::move(data)) {}
50+
BorrowedMutableBuffer(const BorrowedMutableBuffer &) = delete;
51+
BorrowedMutableBuffer &operator=(const BorrowedMutableBuffer &) = delete;
3352

3453
size_t size() const override
3554
{
36-
return data_.size();
55+
return size_;
3756
}
3857

3958
uint8_t *data() override
4059
{
41-
return data_.data();
60+
return data_;
4261
}
4362

4463
private:
45-
std::vector<uint8_t> data_;
46-
};
47-
48-
template <>
49-
struct Bridging<std::vector<uint8_t>> {
50-
static std::vector<uint8_t> fromJs(jsi::Runtime &rt, const jsi::ArrayBuffer &buffer)
51-
{
52-
auto size = buffer.size(rt);
53-
auto data = buffer.data(rt);
54-
return {data, std::next(data, static_cast<std::ptrdiff_t>(size))};
55-
}
56-
57-
static jsi::ArrayBuffer toJs(jsi::Runtime &rt, const std::vector<uint8_t> &data)
58-
{
59-
auto buffer = std::make_shared<OwnedMutableBuffer>(data.data(), data.size());
60-
return {rt, std::move(buffer)};
61-
}
64+
uint8_t *data_;
65+
size_t size_;
66+
std::function<void()> release_;
6267
};
6368

6469
} // namespace facebook::react

packages/react-native/ReactCommon/react/bridging/tests/BridgingTest.cpp

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -780,33 +780,43 @@ TEST_F(BridgingTest, dynamicTest) {
780780
EXPECT_TRUE(undefinedFromJsResult.isNull());
781781
}
782782

783-
TEST_F(BridgingTest, arrayBufferTest) {
784-
// Test round-trip: vector<uint8_t> -> ArrayBuffer -> vector<uint8_t>
785-
auto vec = std::vector<uint8_t>({1, 2, 3, 4, 5});
786-
auto arrayBuffer = bridging::toJs(rt, vec, invoker);
787-
auto result =
788-
bridging::fromJs<std::vector<uint8_t>>(rt, arrayBuffer, invoker);
789-
EXPECT_EQ(vec, result);
790-
791-
// Test empty vector round-trip
792-
auto emptyVec = std::vector<uint8_t>();
793-
auto emptyArrayBuffer = bridging::toJs(rt, emptyVec, invoker);
794-
auto emptyResult =
795-
bridging::fromJs<std::vector<uint8_t>>(rt, emptyArrayBuffer, invoker);
796-
EXPECT_TRUE(emptyResult.empty());
797-
798-
// Test OwnedMutableBuffer constructed from size
799-
auto sizedBuffer = OwnedMutableBuffer(4);
800-
EXPECT_EQ(4, sizedBuffer.size());
801-
// Should be zero-initialized
802-
auto expected_zeros = std::vector<uint8_t>(4, 0);
803-
EXPECT_EQ(0, std::memcmp(sizedBuffer.data(), expected_zeros.data(), 4));
804-
805-
// Test OwnedMutableBuffer constructed from vector
806-
auto inputVec = std::vector<uint8_t>({10, 20, 30});
807-
auto vecBuffer = OwnedMutableBuffer(inputVec);
808-
EXPECT_EQ(3, vecBuffer.size());
809-
EXPECT_EQ(0, std::memcmp(vecBuffer.data(), inputVec.data(), inputVec.size()));
783+
TEST_F(BridgingTest, borrowedMutableBufferTest) {
784+
// Test basic construction and accessors
785+
std::vector<uint8_t> source = {1, 2, 3, 4, 5};
786+
auto borrowed = BorrowedMutableBuffer(source.data(), source.size());
787+
EXPECT_EQ(source.size(), borrowed.size());
788+
EXPECT_EQ(source.data(), borrowed.data()); // pointer identity, no copy
789+
790+
// Test that data is readable through the borrowed pointer
791+
EXPECT_EQ(0, std::memcmp(borrowed.data(), source.data(), source.size()));
792+
793+
// Test mutability through borrowed pointer
794+
borrowed.data()[0] = 99;
795+
EXPECT_EQ(99, source[0]); // mutation visible through original
796+
797+
// Test release callback is invoked on destruction
798+
bool released = false;
799+
{
800+
auto buffer = BorrowedMutableBuffer(
801+
source.data(), source.size(), [&released]() { released = true; });
802+
EXPECT_FALSE(released);
803+
}
804+
EXPECT_TRUE(released);
805+
806+
// Test with nullptr release callback (no-op)
807+
{
808+
auto buffer = BorrowedMutableBuffer(source.data(), source.size());
809+
// Should not crash on destruction
810+
}
811+
812+
// Test zero-copy round-trip through jsi::ArrayBuffer
813+
source[0] = 1; // restore
814+
auto mutableBuffer =
815+
std::make_shared<BorrowedMutableBuffer>(source.data(), source.size());
816+
auto originalPtr = mutableBuffer->data();
817+
auto arrayBuffer = jsi::ArrayBuffer(rt, std::move(mutableBuffer));
818+
EXPECT_EQ(source.size(), arrayBuffer.size(rt));
819+
EXPECT_EQ(originalPtr, arrayBuffer.data(rt)); // pointer identity preserved
810820
}
811821

812822
TEST_F(BridgingTest, highResTimeStampTest) {

packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ JNIArgs convertJSIArgsToJNIArgs(
436436
auto jParams = JDynamicNative::newObjectCxxArgs(dynamicFromValue);
437437
jarg->l = makeGlobalIfNecessary(jParams.release());
438438
} else if (type == "Ljava/nio/ByteBuffer;") {
439-
if (!arg->isObject()) {
439+
if (!arg->isObject() || !arg->getObject(rt).isArrayBuffer(rt)) {
440440
throw JavaTurboModuleArgumentConversionException(
441441
"ArrayBuffer", static_cast<int>(argIndex), methodName, arg, &rt);
442442
}
@@ -992,10 +992,16 @@ jsi::Value JavaTurboModule::invokeJavaMethod(
992992
auto size = jByteBuffer->getDirectSize();
993993

994994
if (size > 0) {
995-
// Copy the data from the ByteBuffer into a new ArrayBuffer.
996-
// We must copy because the ByteBuffer's lifetime is managed by Java.
997-
auto buffer = std::make_shared<OwnedMutableBuffer>(
998-
jByteBuffer->getDirectBytes(), static_cast<size_t>(size));
995+
// Zero-copy: wrap the ByteBuffer's memory directly. A JNI global
996+
// reference prevents Java GC from collecting the ByteBuffer while
997+
// the JS ArrayBuffer is alive. The release callback drops the
998+
// global ref when the JS GC collects the ArrayBuffer.
999+
auto globalRef = jni::make_global(jByteBuffer);
1000+
auto data = globalRef->getDirectBytes();
1001+
auto buffer = std::make_shared<BorrowedMutableBuffer>(
1002+
data,
1003+
static_cast<size_t>(size),
1004+
[prevent_gc = std::move(globalRef)]() { (void)prevent_gc; });
9991005
auto arrayBuffer = jsi::ArrayBuffer(runtime, std::move(buffer));
10001006
returnValue = jsi::Value(runtime, arrayBuffer);
10011007
}

packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,17 @@ static int32_t getUniqueId()
102102
return convertNSDictionaryToJSIObject(runtime, (NSDictionary *)value);
103103
} else if ([value isKindOfClass:[NSArray class]]) {
104104
return convertNSArrayToJSIArray(runtime, (NSArray *)value);
105+
} else if ([value isKindOfClass:[NSData class]]) {
106+
// Zero-copy: wrap the NSData's memory directly. ARC retains the NSData via
107+
// the release callback's block capture, preventing deallocation while the
108+
// JS ArrayBuffer is alive. The release callback fires when the JS GC
109+
// collects the ArrayBuffer.
110+
auto data = (NSData *)value;
111+
auto buffer = std::make_shared<BorrowedMutableBuffer>(
112+
const_cast<uint8_t *>(static_cast<const uint8_t *>(data.bytes)), data.length, [retainedData = data]() {
113+
(void)retainedData;
114+
});
115+
return {runtime, jsi::ArrayBuffer(runtime, std::move(buffer))};
105116
} else if (value == (id)kCFNull) {
106117
return jsi::Value::null();
107118
}
@@ -197,7 +208,11 @@ id convertJSIValueToObjCObject(
197208
}
198209
if (o.isArrayBuffer(runtime)) {
199210
auto ab = o.getArrayBuffer(runtime);
200-
return [NSData dataWithBytes:ab.data(runtime) length:ab.size(runtime)];
211+
// Zero-copy: wrap the JS ArrayBuffer's memory without copying.
212+
// Safe because this is only called during synchronous argument setup,
213+
// and the JS ArrayBuffer is alive for the duration of the call.
214+
// freeWhenDone:NO ensures NSMutableData does not free the JS-owned memory.
215+
return [NSMutableData dataWithBytesNoCopy:(void *)ab.data(runtime) length:ab.size(runtime) freeWhenDone:NO];
201216
}
202217
return convertJSIObjectToNSDictionary(runtime, o, jsInvoker, useNSNull);
203218
}
@@ -531,9 +546,18 @@ TraceSection s(
531546
case PromiseKind:
532547
throw jsi::JSError(runtime, "convertReturnIdToJSIValue: PromiseKind wasn't handled properly.");
533548
case ArrayBufferKind: {
534-
auto data = (NSData *)result;
535-
auto buffer = std::make_shared<OwnedMutableBuffer>(static_cast<const uint8_t *>(data.bytes), data.length);
536-
returnValue = jsi::ArrayBuffer(runtime, std::move(buffer));
549+
auto mutableData = (NSMutableData *)result;
550+
if (mutableData != nil && mutableData.length > 0) {
551+
// Zero-copy: wrap the NSMutableData's memory directly. ARC retains the
552+
// NSMutableData via the release callback's block capture, preventing
553+
// deallocation while the JS ArrayBuffer is alive. The release callback
554+
// fires when the JS GC collects the ArrayBuffer.
555+
auto buffer = std::make_shared<BorrowedMutableBuffer>(
556+
static_cast<uint8_t *>(mutableData.mutableBytes), mutableData.length, [retainedData = mutableData]() {
557+
(void)retainedData;
558+
});
559+
returnValue = jsi::ArrayBuffer(runtime, std::move(buffer));
560+
}
537561
break;
538562
}
539563
}

packages/rn-tester/NativeCxxModuleExample/NativeCxxModuleExample.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,13 @@ AsyncPromise<> NativeCxxModuleExample::promiseAssert(jsi::Runtime& rt) {
269269
jsi::ArrayBuffer NativeCxxModuleExample::getArrayBuffer(
270270
jsi::Runtime& rt,
271271
jsi::ArrayBuffer arg) {
272-
// Return a copy of the input ArrayBuffer
272+
// Return a copy of the input ArrayBuffer. We copy into a heap-allocated
273+
// vector that is kept alive by the BorrowedMutableBuffer release callback.
273274
auto size = arg.size(rt);
274275
auto data = arg.data(rt);
275-
auto buffer = std::make_shared<OwnedMutableBuffer>(data, size);
276+
auto owned = std::make_shared<std::vector<uint8_t>>(data, data + size);
277+
auto buffer = std::make_shared<BorrowedMutableBuffer>(
278+
owned->data(), owned->size(), [owned]() { (void)owned; });
276279
return {rt, std::move(buffer)};
277280
}
278281

packages/rn-tester/NativeCxxModuleExample/tests/NativeCxxModuleExampleTests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ TEST_F(NativeCxxModuleExampleTests, GetArrayReturnsCorrectValues) {
3535
TEST_F(NativeCxxModuleExampleTests, GetArrayBufferReturnsCorrectValues) {
3636
// Create an ArrayBuffer with known data
3737
std::vector<uint8_t> inputData = {1, 2, 3, 4, 5};
38-
auto inputBuffer =
39-
std::make_shared<OwnedMutableBuffer>(inputData.data(), inputData.size());
38+
auto inputBuffer = std::make_shared<BorrowedMutableBuffer>(
39+
inputData.data(), inputData.size());
4040
jsi::ArrayBuffer arg(*runtime_, std::move(inputBuffer));
4141

4242
auto result = module_->getArrayBuffer(*runtime_, std::move(arg));
@@ -47,7 +47,7 @@ TEST_F(NativeCxxModuleExampleTests, GetArrayBufferReturnsCorrectValues) {
4747
}
4848

4949
TEST_F(NativeCxxModuleExampleTests, GetArrayBufferEmptyReturnsEmpty) {
50-
auto inputBuffer = std::make_shared<OwnedMutableBuffer>(nullptr, 0);
50+
auto inputBuffer = std::make_shared<BorrowedMutableBuffer>(nullptr, 0);
5151
jsi::ArrayBuffer arg(*runtime_, std::move(inputBuffer));
5252

5353
auto result = module_->getArrayBuffer(*runtime_, std::move(arg));

scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,6 +1838,15 @@ class facebook::react::BlobModuleJSIBindings : public jni::JavaClass<facebook::r
18381838
public static void registerNatives();
18391839
}
18401840

1841+
class facebook::react::BorrowedMutableBuffer : public facebook::jsi::MutableBuffer {
1842+
public BorrowedMutableBuffer(const facebook::react::BorrowedMutableBuffer&) = delete;
1843+
public BorrowedMutableBuffer(uint8_t* data, size_t size, std::function<void()> release = nullptr);
1844+
public facebook::react::BorrowedMutableBuffer& operator=(const facebook::react::BorrowedMutableBuffer&) = delete;
1845+
public virtual size_t size() const override;
1846+
public virtual uint8_t* data() override;
1847+
public ~BorrowedMutableBuffer() override;
1848+
}
1849+
18411850
class facebook::react::BridgelessNativeMethodCallInvoker : public facebook::react::NativeMethodCallInvoker {
18421851
public BridgelessNativeMethodCallInvoker(std::shared_ptr<facebook::react::MessageQueueThread> messageQueueThread);
18431852
public virtual void invokeAsync(const std::string& methodName, facebook::react::NativeMethodCallFunc&& func) noexcept override;
@@ -3909,14 +3918,6 @@ class facebook::react::OperatorAnimatedNode : public facebook::react::ValueAnima
39093918
public OperatorAnimatedNode(facebook::react::Tag tag, const folly::dynamic& config, facebook::react::NativeAnimatedNodesManager& manager);
39103919
}
39113920

3912-
class facebook::react::OwnedMutableBuffer : public facebook::jsi::MutableBuffer {
3913-
public OwnedMutableBuffer(const uint8_t* data, size_t size);
3914-
public OwnedMutableBuffer(size_t size);
3915-
public OwnedMutableBuffer(std::vector<uint8_t> data);
3916-
public virtual size_t size() const override;
3917-
public virtual uint8_t* data() override;
3918-
}
3919-
39203921
class facebook::react::ParagraphAttributes : public facebook::react::DebugStringConvertible {
39213922
public bool adjustsFontSizeToFit;
39223923
public bool includeFontPadding;
@@ -9467,11 +9468,6 @@ struct facebook::react::Bridging<std::string_view> {
94679468
public static facebook::jsi::String toJs(facebook::jsi::Runtime& rt, std::string_view value);
94689469
}
94699470

9470-
struct facebook::react::Bridging<std::vector<uint8_t>> {
9471-
public static facebook::jsi::ArrayBuffer toJs(facebook::jsi::Runtime& rt, const std::vector<uint8_t>& data);
9472-
public static std::vector<uint8_t> fromJs(facebook::jsi::Runtime& rt, const facebook::jsi::ArrayBuffer& buffer);
9473-
}
9474-
94759471
template <typename R, typename... Args>
94769472
struct facebook::react::Bridging<std::function<R(Args...)>> {
94779473
public static constexpr size_t kArgumentCount;

scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,6 +1836,15 @@ class facebook::react::BlobModuleJSIBindings : public jni::JavaClass<facebook::r
18361836
public static void registerNatives();
18371837
}
18381838

1839+
class facebook::react::BorrowedMutableBuffer : public facebook::jsi::MutableBuffer {
1840+
public BorrowedMutableBuffer(const facebook::react::BorrowedMutableBuffer&) = delete;
1841+
public BorrowedMutableBuffer(uint8_t* data, size_t size, std::function<void()> release = nullptr);
1842+
public facebook::react::BorrowedMutableBuffer& operator=(const facebook::react::BorrowedMutableBuffer&) = delete;
1843+
public virtual size_t size() const override;
1844+
public virtual uint8_t* data() override;
1845+
public ~BorrowedMutableBuffer() override;
1846+
}
1847+
18391848
class facebook::react::BridgelessNativeMethodCallInvoker : public facebook::react::NativeMethodCallInvoker {
18401849
public BridgelessNativeMethodCallInvoker(std::shared_ptr<facebook::react::MessageQueueThread> messageQueueThread);
18411850
public virtual void invokeAsync(const std::string& methodName, facebook::react::NativeMethodCallFunc&& func) noexcept override;
@@ -3906,14 +3915,6 @@ class facebook::react::OperatorAnimatedNode : public facebook::react::ValueAnima
39063915
public OperatorAnimatedNode(facebook::react::Tag tag, const folly::dynamic& config, facebook::react::NativeAnimatedNodesManager& manager);
39073916
}
39083917

3909-
class facebook::react::OwnedMutableBuffer : public facebook::jsi::MutableBuffer {
3910-
public OwnedMutableBuffer(const uint8_t* data, size_t size);
3911-
public OwnedMutableBuffer(size_t size);
3912-
public OwnedMutableBuffer(std::vector<uint8_t> data);
3913-
public virtual size_t size() const override;
3914-
public virtual uint8_t* data() override;
3915-
}
3916-
39173918
class facebook::react::ParagraphAttributes : public facebook::react::DebugStringConvertible {
39183919
public bool adjustsFontSizeToFit;
39193920
public bool includeFontPadding;
@@ -9323,11 +9324,6 @@ struct facebook::react::Bridging<std::string_view> {
93239324
public static facebook::jsi::String toJs(facebook::jsi::Runtime& rt, std::string_view value);
93249325
}
93259326

9326-
struct facebook::react::Bridging<std::vector<uint8_t>> {
9327-
public static facebook::jsi::ArrayBuffer toJs(facebook::jsi::Runtime& rt, const std::vector<uint8_t>& data);
9328-
public static std::vector<uint8_t> fromJs(facebook::jsi::Runtime& rt, const facebook::jsi::ArrayBuffer& buffer);
9329-
}
9330-
93319327
template <typename R, typename... Args>
93329328
struct facebook::react::Bridging<std::function<R(Args...)>> {
93339329
public static constexpr size_t kArgumentCount;

0 commit comments

Comments
 (0)