From ebbd4371c9853fd63b365fc56147b2e293a793e4 Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Mon, 26 Feb 2018 12:22:30 -0800 Subject: [PATCH] Mark ObjC methods that are called from React Native as dynamic. Reviewed By: mmmulani Differential Revision: D7087100 fbshipit-source-id: 18e5726e5b48e7b71fcaab19f6fe73be0cad6233 --- React/Base/RCTBridgeModule.h | 2 +- React/Base/RCTConvert.h | 8 ++++---- React/Base/RCTDefines.h | 11 +++++++++++ React/Views/RCTViewManager.h | 12 ++++++------ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index 2f8887a58..f138868eb 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -185,7 +185,7 @@ RCT_EXTERN void RCTRegisterModule(Class); \ */ #define RCT_REMAP_METHOD(js_name, method) \ _RCT_EXTERN_REMAP_METHOD(js_name, method, NO) \ - - (void)method; + - (void)method RCT_DYNAMIC; /** * Similar to RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD but lets you set diff --git a/React/Base/RCTConvert.h b/React/Base/RCTConvert.h index a92927a68..5780c5f5f 100644 --- a/React/Base/RCTConvert.h +++ b/React/Base/RCTConvert.h @@ -177,7 +177,7 @@ RCT_CUSTOM_CONVERTER(type, name, [json getter]) * This macro is used for creating converter functions with arbitrary logic. */ #define RCT_CUSTOM_CONVERTER(type, name, code) \ -+ (type)name:(id)json \ ++ (type)name:(id)json RCT_DYNAMIC \ { \ if (!RCT_DEBUG) { \ return code; \ @@ -216,7 +216,7 @@ RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter * This macro is used for creating converters for enum types. */ #define RCT_ENUM_CONVERTER(type, values, default, getter) \ -+ (type)type:(id)json \ ++ (type)type:(id)json RCT_DYNAMIC \ { \ static NSDictionary *mapping; \ static dispatch_once_t onceToken; \ @@ -231,7 +231,7 @@ RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter * multiple enum values combined with | operator */ #define RCT_MULTI_ENUM_CONVERTER(type, values, default, getter) \ -+ (type)type:(id)json \ ++ (type)type:(id)json RCT_DYNAMIC \ { \ static NSDictionary *mapping; \ static dispatch_once_t onceToken; \ @@ -246,7 +246,7 @@ RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter * for typed arrays. */ #define RCT_ARRAY_CONVERTER_NAMED(type, name) \ -+ (NSArray *)name##Array:(id)json \ ++ (NSArray *)name##Array:(id)json RCT_DYNAMIC \ { \ return RCTConvertArrayValue(@selector(name:), json); \ } diff --git a/React/Base/RCTDefines.h b/React/Base/RCTDefines.h index 6956ec4df..881af139d 100644 --- a/React/Base/RCTDefines.h +++ b/React/Base/RCTDefines.h @@ -104,6 +104,17 @@ #define RCT_CONCAT2(A, B) A ## B #define RCT_CONCAT(A, B) RCT_CONCAT2(A, B) +/** + * This attribute is used for static analysis. + */ +#if !defined RCT_DYNAMIC +#if __has_attribute(objc_dynamic) +#define RCT_DYNAMIC __attribute__((objc_dynamic)) +#else +#define RCT_DYNAMIC +#endif +#endif + /** * Throw an assertion for unimplemented methods. */ diff --git a/React/Views/RCTViewManager.h b/React/Views/RCTViewManager.h index 7be342a8e..2edadcc77 100644 --- a/React/Views/RCTViewManager.h +++ b/React/Views/RCTViewManager.h @@ -65,13 +65,13 @@ typedef void (^RCTViewManagerUIBlock)(RCTUIManager *uiManager, NSDictionary *)propConfig_##name { return @[@#type]; } ++ (NSArray *)propConfig_##name RCT_DYNAMIC { return @[@#type]; } /** * This macro maps a named property to an arbitrary key path in the view. */ #define RCT_REMAP_VIEW_PROPERTY(name, keyPath, type) \ -+ (NSArray *)propConfig_##name { return @[@#type, @#keyPath]; } ++ (NSArray *)propConfig_##name RCT_DYNAMIC { return @[@#type, @#keyPath]; } /** * This macro can be used when you need to provide custom logic for setting @@ -80,19 +80,19 @@ typedef void (^RCTViewManagerUIBlock)(RCTUIManager *uiManager, NSDictionary *)propConfigShadow_##name { return @[@#type]; } ++ (NSArray *)propConfigShadow_##name RCT_DYNAMIC { return @[@#type]; } /** * This macro maps a named property to an arbitrary key path in the shadow view. */ #define RCT_REMAP_SHADOW_PROPERTY(name, keyPath, type) \ -+ (NSArray *)propConfigShadow_##name { return @[@#type, @#keyPath]; } ++ (NSArray *)propConfigShadow_##name RCT_DYNAMIC { return @[@#type, @#keyPath]; } /** * This macro can be used when you need to provide custom logic for setting @@ -101,6 +101,6 @@ RCT_REMAP_VIEW_PROPERTY(name, __custom__, type) \ */ #define RCT_CUSTOM_SHADOW_PROPERTY(name, type, viewClass) \ RCT_REMAP_SHADOW_PROPERTY(name, __custom__, type) \ -- (void)set_##name:(id)json forShadowView:(viewClass *)view +- (void)set_##name:(id)json forShadowView:(viewClass *)view RCT_DYNAMIC @end