diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 5981e1faa0ae0a..55265010e0945d 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -161,6 +161,10 @@ RCT_EXTERN void RCTEnableTurboModuleEagerInit(BOOL enabled); RCT_EXTERN BOOL RCTTurboModuleSharedMutexInitEnabled(void); RCT_EXTERN void RCTEnableTurboModuleSharedMutexInit(BOOL enabled); +// Turn on TurboModule block copy +RCT_EXTERN BOOL RCTTurboModuleBlockCopyEnabled(void); +RCT_EXTERN void RCTEnableTurboModuleBlockCopy(BOOL enabled); + /** * Async batched bridge used to communicate with the JavaScript application. */ diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 8cca1a00b9d749..7d5c9cd414b151 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -136,6 +136,17 @@ void RCTEnableTurboModuleSharedMutexInit(BOOL enabled) turboModuleSharedMutexInitEnabled = enabled; } +static BOOL turboModuleBlockCopyEnabled = NO; +BOOL RCTTurboModuleBlockCopyEnabled(void) +{ + return turboModuleBlockCopyEnabled; +} + +void RCTEnableTurboModuleBlockCopy(BOOL enabled) +{ + turboModuleBlockCopyEnabled = enabled; +} + @interface RCTBridge () @end diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModule.mm b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModule.mm index c8950c5718fe6a..4c7d3031bfb442 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModule.mm +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModule.mm @@ -195,7 +195,11 @@ static int32_t getUniqueId() wrapperWasCalled = YES; }; - return [callback copy]; + if (RCTTurboModuleBlockCopyEnabled()) { + return [callback copy]; + } + + return callback; } namespace facebook { @@ -636,8 +640,13 @@ static int32_t getUniqueId() runtime, jsInvoker_, ^(RCTPromiseResolveBlock resolveBlock, RCTPromiseRejectBlock rejectBlock) { - RCTPromiseResolveBlock resolveCopy = [resolveBlock copy]; - RCTPromiseRejectBlock rejectCopy = [rejectBlock copy]; + RCTPromiseResolveBlock resolveCopy = resolveBlock; + RCTPromiseRejectBlock rejectCopy = rejectBlock; + + if (RCTTurboModuleBlockCopyEnabled()) { + resolveCopy = [resolveBlock copy]; + rejectCopy = [rejectBlock copy]; + } [inv setArgument:(void *)&resolveCopy atIndex:count + 2]; [inv setArgument:(void *)&rejectCopy atIndex:count + 3];