From d270dca21013d0bcfda8c78533d1555fff3660ce Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Mon, 15 Jun 2015 06:04:53 -0700 Subject: [PATCH] [ReactNative] Avoid method clashing on categories Summary: @public Include `js_name` and `__LINE__` on exported methods' generated names + use the method implementation instead of `objc_msgSend` on the bridge, so it still works in case of clashing. Test Plan: Everything still working, otherwise it'd crash at startup. --- React/Base/RCTBridge.m | 5 +++-- React/Base/RCTBridgeModule.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 5b63b1d0bb..52e0ecd98c 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -496,7 +496,8 @@ static RCTSparseArray *RCTExportedMethodsByModuleID(void) Method method = methods[i]; SEL selector = method_getName(method); if ([NSStringFromSelector(selector) hasPrefix:@"__rct_export__"]) { - NSArray *entries = ((NSArray *(*)(id, SEL))objc_msgSend)(moduleClass, selector); + IMP imp = method_getImplementation(method); + NSArray *entries = ((NSArray *(*)(id, SEL))imp)(moduleClass, selector); RCTModuleMethod *moduleMethod = [[RCTModuleMethod alloc] initWithObjCMethodName:entries[1] JSMethodName:entries[0] @@ -1018,7 +1019,7 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin if ([module conformsToProtocol:@protocol(RCTFrameUpdateObserver)]) { [_frameUpdateObservers addObject:module]; - } + } }]; } diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index fc662778ca..90090e8471 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -176,7 +176,7 @@ extern const dispatch_queue_t RCTJSThread; * Like RCT_EXTERN_REMAP_METHOD, but allows setting a custom JavaScript name. */ #define RCT_EXTERN_REMAP_METHOD(js_name, method) \ - + (NSArray *)RCT_CONCAT(__rct_export__, __COUNTER__) { \ + + (NSArray *)RCT_CONCAT(__rct_export__, RCT_CONCAT(js_name, RCT_CONCAT(__LINE__, __COUNTER__))) { \ return @[@#js_name, @#method]; \ } \