diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m index 280aaf3b3..60f41747b 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m @@ -24,7 +24,7 @@ @property (nonatomic, strong, readonly) RCTBridge *batchedBridge; -- (void)_handleBuffer:(id)buffer context:(NSNumber *)context; +- (void)_handleBuffer:(id)buffer; - (void)setUp; @end @@ -57,7 +57,6 @@ RCT_EXPORT_MODULE() - (void)executeJSCall:(__unused NSString *)name method:(__unused NSString *)method arguments:(__unused NSArray *)arguments - context:(__unused NSNumber *)executorID callback:(RCTJavaScriptCallback)onComplete { onComplete(nil, nil); @@ -155,7 +154,7 @@ RCT_EXPORT_MODULE(TestModule) NSArray *args = @[@1234, @5678, @"stringy", @{@"a": @1}, @42]; NSArray *buffer = @[@[testModuleID], @[testMethodID], @[args], @[], @1234567]; - [_bridge.batchedBridge _handleBuffer:buffer context:RCTGetExecutorID(executor)]; + [_bridge.batchedBridge _handleBuffer:buffer]; dispatch_sync(_methodQueue, ^{ // clear the queue diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m index 02450fab6..18b4118ba 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m @@ -33,7 +33,6 @@ { [super setUp]; _executor = [[RCTContextExecutor alloc] init]; - RCTSetExecutorID(_executor); [_executor setUp]; } @@ -139,7 +138,6 @@ static uint64_t _get_time_nanoseconds(void) [_executor executeJSCall:@"module" method:@"method" arguments:params - context:RCTGetExecutorID(_executor) callback:^(id json, __unused NSError *unused) { XCTAssert([json isEqual:@YES], @"Invalid return"); }]; diff --git a/Libraries/WebSocket/RCTWebSocketExecutor.m b/Libraries/WebSocket/RCTWebSocketExecutor.m index 0f8f433b0..08b130314 100644 --- a/Libraries/WebSocket/RCTWebSocketExecutor.m +++ b/Libraries/WebSocket/RCTWebSocketExecutor.m @@ -97,7 +97,7 @@ RCT_EXPORT_MODULE() { __block NSError *initError; dispatch_semaphore_t s = dispatch_semaphore_create(0); - [self sendMessage:@{@"method": @"prepareJSRuntime"} context:nil waitForReply:^(NSError *error, NSDictionary *reply) { + [self sendMessage:@{@"method": @"prepareJSRuntime"} waitForReply:^(NSError *error, NSDictionary *reply) { initError = error; dispatch_semaphore_signal(s); }]; @@ -126,7 +126,7 @@ RCT_EXPORT_MODULE() RCTLogError(@"WebSocket connection failed with error %@", error); } -- (void)sendMessage:(NSDictionary *)message context:(NSNumber *)executorID waitForReply:(RCTWSMessageCallback)callback +- (void)sendMessage:(NSDictionary *)message waitForReply:(RCTWSMessageCallback)callback { static NSUInteger lastID = 10000; @@ -137,8 +137,6 @@ RCT_EXPORT_MODULE() }]; callback(error, nil); return; - } else if (executorID && ![RCTGetExecutorID(self) isEqualToNumber:executorID]) { - return; } NSNumber *expectedID = @(lastID++); @@ -152,12 +150,12 @@ RCT_EXPORT_MODULE() - (void)executeApplicationScript:(NSString *)script sourceURL:(NSURL *)URL onComplete:(RCTJavaScriptCompleteBlock)onComplete { NSDictionary *message = @{@"method": @"executeApplicationScript", @"url": [URL absoluteString], @"inject": _injectedObjects}; - [self sendMessage:message context:nil waitForReply:^(NSError *error, NSDictionary *reply) { + [self sendMessage:message waitForReply:^(NSError *error, NSDictionary *reply) { onComplete(error); }]; } -- (void)executeJSCall:(NSString *)name method:(NSString *)method arguments:(NSArray *)arguments context:(NSNumber *)executorID callback:(RCTJavaScriptCallback)onComplete +- (void)executeJSCall:(NSString *)name method:(NSString *)method arguments:(NSArray *)arguments callback:(RCTJavaScriptCallback)onComplete { RCTAssert(onComplete != nil, @"callback was missing for exec JS call"); NSDictionary *message = @{ @@ -166,7 +164,7 @@ RCT_EXPORT_MODULE() @"moduleMethod": method, @"arguments": arguments }; - [self sendMessage:message context:executorID waitForReply:^(NSError *socketError, NSDictionary *reply) { + [self sendMessage:message waitForReply:^(NSError *socketError, NSDictionary *reply) { if (socketError) { onComplete(nil, socketError); return; diff --git a/React/Base/RCTBatchedBridge.m b/React/Base/RCTBatchedBridge.m index 49cf49bb0..138e11695 100644 --- a/React/Base/RCTBatchedBridge.m +++ b/React/Base/RCTBatchedBridge.m @@ -200,7 +200,6 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL */ _javaScriptExecutor = _modulesByName[RCTBridgeModuleNameForClass(self.executorClass)]; RCTLatestExecutor = _javaScriptExecutor; - RCTSetExecutorID(_javaScriptExecutor); [_javaScriptExecutor setUp]; @@ -410,8 +409,7 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL [self _invokeAndProcessModule:@"BatchedBridge" method:@"callFunctionReturnFlushedQueue" - arguments:@[ids[0], ids[1], args ?: @[]] - context:RCTGetExecutorID(_javaScriptExecutor)]; + arguments:@[ids[0], ids[1], args ?: @[]]]; } /** @@ -424,8 +422,7 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL dispatch_block_t block = ^{ [self _actuallyInvokeAndProcessModule:@"BatchedBridge" method:@"callFunctionReturnFlushedQueue" - arguments:@[@"JSTimersExecution", @"callTimers", @[@[timer]]] - context:RCTGetExecutorID(_javaScriptExecutor)]; + arguments:@[@"JSTimersExecution", @"callTimers", @[@[timer]]]]; }; if ([_javaScriptExecutor respondsToSelector:@selector(executeAsyncBlockOnJavaScriptQueue:)]) { @@ -450,18 +447,16 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL } RCTProfileBeginEvent(); - NSNumber *context = RCTGetExecutorID(_javaScriptExecutor); [_javaScriptExecutor executeJSCall:@"BatchedBridge" method:@"flushedQueue" arguments:@[] - context:context callback:^(id json, NSError *error) { RCTProfileEndEvent(@"FetchApplicationScriptCallbacks", @"js_call,init", @{ @"json": RCTNullIfNil(json), @"error": RCTNullIfNil(error), }); - [self _handleBuffer:json context:context]; + [self _handleBuffer:json]; onComplete(error); }]; @@ -470,22 +465,11 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL #pragma mark - Payload Generation -/** - * TODO: Completely remove `context` - no longer needed - */ -- (void)_invokeAndProcessModule:(NSString *)module method:(NSString *)method arguments:(NSArray *)args -{ - [self _invokeAndProcessModule:module - method:method - arguments:args - context:RCTGetExecutorID(_javaScriptExecutor)]; -} - /** * Called by enqueueJSCall from any thread, or from _immediatelyCallTimer, * on the JS thread, but only in non-batched mode. */ -- (void)_invokeAndProcessModule:(NSString *)module method:(NSString *)method arguments:(NSArray *)args context:(NSNumber *)context +- (void)_invokeAndProcessModule:(NSString *)module method:(NSString *)method arguments:(NSArray *)args { /** * AnyThread @@ -511,7 +495,6 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL @"method": method, @"args": args, }, - @"context": context ?: @0, RCT_IF_DEV(@"call_id": callID,) }; if ([method isEqualToString:@"invokeCallbackAndReturnFlushedQueue"]) { @@ -524,7 +507,7 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL }]; } -- (void)_actuallyInvokeAndProcessModule:(NSString *)module method:(NSString *)method arguments:(NSArray *)args context:(NSNumber *)context +- (void)_actuallyInvokeAndProcessModule:(NSString *)module method:(NSString *)method arguments:(NSArray *)args { RCTAssertJSThread(); @@ -539,19 +522,18 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL return; } [[NSNotificationCenter defaultCenter] postNotificationName:RCTDequeueNotification object:nil userInfo:nil]; - [self _handleBuffer:json context:context]; + [self _handleBuffer:json]; }; [_javaScriptExecutor executeJSCall:module method:method arguments:args - context:context callback:processResponse]; } #pragma mark - Payload Processing -- (void)_handleBuffer:(id)buffer context:(NSNumber *)context +- (void)_handleBuffer:(id)buffer { RCTAssertJSThread(); @@ -614,8 +596,7 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL [self _handleRequestNumber:index moduleID:[moduleIDs[index] integerValue] methodID:[methodIDs[index] integerValue] - params:paramsArrays[index] - context:context]; + params:paramsArrays[index]]; } } RCTProfileEndEvent(RCTCurrentThreadName(), @"objc_call,dispatch_async", @{ @"calls": @(calls.count) }); @@ -636,7 +617,6 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL moduleID:(NSUInteger)moduleID methodID:(NSUInteger)methodID params:(NSArray *)params - context:(NSNumber *)context { if (!self.isValid) { return NO; @@ -663,7 +643,7 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL } @try { - [method invokeWithBridge:self module:moduleData.instance arguments:params context:context]; + [method invokeWithBridge:self module:moduleData.instance arguments:params]; } @catch (NSException *exception) { RCTLogError(@"Exception thrown while invoking %@ on target %@ with params %@: %@", method.JSMethodName, moduleData.name, params, exception); @@ -704,12 +684,6 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL } NSArray *calls = [_scheduledCallbacks.allObjects arrayByAddingObjectsFromArray:_scheduledCalls]; - NSNumber *currentExecutorID = RCTGetExecutorID(_javaScriptExecutor); - calls = [calls filteredArrayUsingPredicate: - [NSPredicate predicateWithBlock: - ^BOOL(NSDictionary *call, __unused NSDictionary *bindings) { - return [call[@"context"] isEqualToNumber:currentExecutorID]; - }]]; RCT_IF_DEV( RCTProfileImmediateEvent(@"JS Thread Tick", displayLink.timestamp, @"g"); @@ -724,8 +698,7 @@ RCT_NOT_IMPLEMENTED(-initWithBundleURL:(__unused NSURL *)bundleURL _scheduledCallbacks = [[RCTSparseArray alloc] init]; [self _actuallyInvokeAndProcessModule:@"BatchedBridge" method:@"processBatch" - arguments:@[[calls valueForKey:@"js_args"]] - context:RCTGetExecutorID(_javaScriptExecutor)]; + arguments:@[[calls valueForKey:@"js_args"]]]; } RCTProfileEndEvent(@"DispatchFrameUpdate", @"objc_call", nil); diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index c6baf82a6..b81eae17a 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -230,7 +230,6 @@ RCT_NOT_IMPLEMENTED(-init) [RCTGetLatestExecutor() executeJSCall:@"RCTLog" method:@"logIfNoNativeHook" arguments:@[level, message] - context:RCTGetExecutorID(RCTGetLatestExecutor()) callback:^(__unused id json, __unused NSError *error) {}]; }); } @@ -254,7 +253,6 @@ RCT_NOT_IMPLEMENTED(-init) RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(__unused NSString *)module method:(__unused NSString *)method - arguments:(__unused NSArray *)args - context:(__unused NSNumber *)context) + arguments:(__unused NSArray *)args); @end diff --git a/React/Base/RCTJavaScriptExecutor.h b/React/Base/RCTJavaScriptExecutor.h index fa5afc5cb..af4b4cef6 100644 --- a/React/Base/RCTJavaScriptExecutor.h +++ b/React/Base/RCTJavaScriptExecutor.h @@ -36,7 +36,6 @@ typedef void (^RCTJavaScriptCallback)(id json, NSError *error); - (void)executeJSCall:(NSString *)name method:(NSString *)method arguments:(NSArray *)arguments - context:(NSNumber *)executorID callback:(RCTJavaScriptCallback)onComplete; /** @@ -66,6 +65,3 @@ typedef void (^RCTJavaScriptCallback)(id json, NSError *error); - (void)executeAsyncBlockOnJavaScriptQueue:(dispatch_block_t)block; @end - -void RCTSetExecutorID(id executor); -NSNumber *RCTGetExecutorID(id executor); diff --git a/React/Base/RCTJavaScriptExecutor.m b/React/Base/RCTJavaScriptExecutor.m deleted file mode 100644 index 04e3db433..000000000 --- a/React/Base/RCTJavaScriptExecutor.m +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "RCTJavaScriptExecutor.h" - - -static const char *RCTJavaScriptExecutorID = "RCTJavaScriptExecutorID"; - -void RCTSetExecutorID(id executor) -{ - static NSUInteger executorID = 0; - if (executor) { - objc_setAssociatedObject(executor, RCTJavaScriptExecutorID, @(++executorID), OBJC_ASSOCIATION_RETAIN); - } -} - -NSNumber *RCTGetExecutorID(id executor) -{ - return executor ? objc_getAssociatedObject(executor, RCTJavaScriptExecutorID) : @0; -} diff --git a/React/Base/RCTModuleMethod.h b/React/Base/RCTModuleMethod.h index ffaa22ef7..710b1b899 100644 --- a/React/Base/RCTModuleMethod.h +++ b/React/Base/RCTModuleMethod.h @@ -29,7 +29,6 @@ typedef NS_ENUM(NSUInteger, RCTJavaScriptFunctionKind) { - (void)invokeWithBridge:(RCTBridge *)bridge module:(id)module - arguments:(NSArray *)arguments - context:(NSNumber *)context; + arguments:(NSArray *)arguments; @end diff --git a/React/Base/RCTModuleMethod.m b/React/Base/RCTModuleMethod.m index e56b11a8e..d13232646 100644 --- a/React/Base/RCTModuleMethod.m +++ b/React/Base/RCTModuleMethod.m @@ -88,7 +88,7 @@ RCT_NOT_IMPLEMENTED(-init) NSMutableArray *argumentBlocks = [[NSMutableArray alloc] initWithCapacity:numberOfArguments - 2]; #define RCT_ARG_BLOCK(_logic) \ - [argumentBlocks addObject:^(__unused RCTBridge *bridge, __unused NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) { \ + [argumentBlocks addObject:^(__unused RCTBridge *bridge, NSInvocation *invocation, NSUInteger index, id json) { \ _logic \ [invocation setArgument:&value atIndex:index]; \ }]; \ @@ -154,7 +154,7 @@ case _value: { \ RCT_CONVERT_CASE('^', void *) case '{': { - [argumentBlocks addObject:^(__unused RCTBridge *bridge, __unused NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) { + [argumentBlocks addObject:^(__unused RCTBridge *bridge, NSInvocation *invocation, NSUInteger index, id json) { NSMethodSignature *methodSignature = [RCTConvert methodSignatureForSelector:selector]; void *returnValue = malloc(methodSignature.methodReturnLength); NSInvocation *_invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; @@ -249,7 +249,6 @@ case _value: { \ - (void)invokeWithBridge:(RCTBridge *)bridge module:(id)module arguments:(NSArray *)arguments - context:(NSNumber *)context { if (RCT_DEBUG) { @@ -284,8 +283,8 @@ case _value: { \ NSUInteger index = 0; for (id json in arguments) { id arg = RCTNilIfNull(json); - void (^block)(RCTBridge *, NSNumber *, NSInvocation *, NSUInteger, id) = _argumentBlocks[index]; - block(bridge, context, invocation, index + 2, arg); + void (^block)(RCTBridge *, NSInvocation *, NSUInteger, id) = _argumentBlocks[index]; + block(bridge, invocation, index + 2, arg); index++; } diff --git a/React/Executors/RCTContextExecutor.m b/React/Executors/RCTContextExecutor.m index 200a3f645..5fc529645 100644 --- a/React/Executors/RCTContextExecutor.m +++ b/React/Executors/RCTContextExecutor.m @@ -330,14 +330,13 @@ static NSError *RCTNSErrorFromJSError(JSContextRef context, JSValueRef jsError) - (void)executeJSCall:(NSString *)name method:(NSString *)method arguments:(NSArray *)arguments - context:(NSNumber *)executorID callback:(RCTJavaScriptCallback)onComplete { RCTAssert(onComplete != nil, @"onComplete block should not be nil"); __weak RCTContextExecutor *weakSelf = self; [self executeBlockOnJavaScriptQueue:RCTProfileBlock((^{ RCTContextExecutor *strongSelf = weakSelf; - if (!strongSelf || !strongSelf.isValid || ![RCTGetExecutorID(strongSelf) isEqualToNumber:executorID]) { + if (!strongSelf || !strongSelf.isValid) { return; } NSError *error; diff --git a/React/Executors/RCTWebViewExecutor.m b/React/Executors/RCTWebViewExecutor.m index 0d8f0ad0f..539b9e779 100644 --- a/React/Executors/RCTWebViewExecutor.m +++ b/React/Executors/RCTWebViewExecutor.m @@ -92,12 +92,11 @@ RCT_EXPORT_MODULE() - (void)executeJSCall:(NSString *)name method:(NSString *)method arguments:(NSArray *)arguments - context:(NSNumber *)executorID callback:(RCTJavaScriptCallback)onComplete { RCTAssert(onComplete != nil, @""); [self executeBlockOnJavaScriptQueue:^{ - if (!self.isValid || ![RCTGetExecutorID(self) isEqualToNumber:executorID]) { + if (!self.isValid) { return; } diff --git a/React/React.xcodeproj/project.pbxproj b/React/React.xcodeproj/project.pbxproj index 5e0434b30..1e193d9b2 100644 --- a/React/React.xcodeproj/project.pbxproj +++ b/React/React.xcodeproj/project.pbxproj @@ -64,7 +64,6 @@ 58114A501AAE93D500E7D092 /* RCTAsyncLocalStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 58114A4E1AAE93D500E7D092 /* RCTAsyncLocalStorage.m */; }; 58C571C11AA56C1900CDF9C8 /* RCTDatePickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C571BF1AA56C1900CDF9C8 /* RCTDatePickerManager.m */; }; 63F014C01B02080B003B75D2 /* RCTPointAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F014BF1B02080B003B75D2 /* RCTPointAnnotation.m */; }; - 783ABB351B38A9D3003FFD95 /* RCTJavaScriptExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = 783ABB341B38A9D3003FFD95 /* RCTJavaScriptExecutor.m */; }; 830A229E1A66C68A008503DA /* RCTRootView.m in Sources */ = {isa = PBXBuildFile; fileRef = 830A229D1A66C68A008503DA /* RCTRootView.m */; }; 832348161A77A5AA00B55238 /* Layout.c in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FC71A68125100A75B9A /* Layout.c */; }; 83CBBA511A601E3B00E9B192 /* RCTAssert.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CBBA4B1A601E3B00E9B192 /* RCTAssert.m */; }; @@ -213,7 +212,6 @@ 58C571C01AA56C1900CDF9C8 /* RCTDatePickerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTDatePickerManager.h; sourceTree = ""; }; 63F014BE1B02080B003B75D2 /* RCTPointAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTPointAnnotation.h; sourceTree = ""; }; 63F014BF1B02080B003B75D2 /* RCTPointAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTPointAnnotation.m; sourceTree = ""; }; - 783ABB341B38A9D3003FFD95 /* RCTJavaScriptExecutor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTJavaScriptExecutor.m; sourceTree = ""; }; 830213F31A654E0800B993E6 /* RCTBridgeModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBridgeModule.h; sourceTree = ""; }; 830A229C1A66C68A008503DA /* RCTRootView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTRootView.h; sourceTree = ""; }; 830A229D1A66C68A008503DA /* RCTRootView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTRootView.m; sourceTree = ""; }; @@ -431,7 +429,6 @@ 14C2CA751B3AC64F00E6CBB2 /* RCTFrameUpdate.m */, 83CBBA4C1A601E3B00E9B192 /* RCTInvalidating.h */, 83CBBA631A601ECA00E9B192 /* RCTJavaScriptExecutor.h */, - 783ABB341B38A9D3003FFD95 /* RCTJavaScriptExecutor.m */, 14200DA81AC179B3008EE6BA /* RCTJavaScriptLoader.h */, 14200DA91AC179B3008EE6BA /* RCTJavaScriptLoader.m */, 13A1F71C1A75392D00D3D453 /* RCTKeyCommands.h */, @@ -572,7 +569,6 @@ 134FCB3D1A6E7F0800051CC8 /* RCTContextExecutor.m in Sources */, 14C2CA781B3ACB0400E6CBB2 /* RCTBatchedBridge.m in Sources */, 13E067591A70F44B002CDEE1 /* UIView+React.m in Sources */, - 783ABB351B38A9D3003FFD95 /* RCTJavaScriptExecutor.m in Sources */, 14F484561AABFCE100FDF6B9 /* RCTSliderManager.m in Sources */, 14C2CA741B3AC64300E6CBB2 /* RCTModuleData.m in Sources */, 142014191B32094000CC17BA /* RCTPerformanceLogger.m in Sources */,