1 // Copyright © 2018 650 Industries. All rights reserved. 2 3 #if defined(__cplusplus) 4 #define EX_EXTERN extern "C" __attribute__((visibility("default"))) 5 #define EX_EXTERN_C_BEGIN extern "C" { 6 #define EX_EXTERN_C_END } 7 #else 8 #define EX_EXTERN extern __attribute__((visibility("default"))) 9 #define EX_EXTERN_C_BEGIN 10 #define EX_EXTERN_C_END 11 #endif 12 13 EX_EXTERN_C_BEGIN 14 15 #define EX_EXPORTED_METHODS_PREFIX __ex_export__ 16 #define EX_PROPSETTERS_PREFIX __ex_set__ 17 18 #define EX_DO_CONCAT(A, B) A ## B 19 #define EX_CONCAT(A, B) EX_DO_CONCAT(A, B) 20 21 #define EX_EXPORT_METHOD_AS(external_name, method) \ 22 _EX_EXTERN_METHOD(external_name, method) \ 23 - (void)method 24 25 #define _EX_EXTERN_METHOD(external_name, method) \ 26 + (const EXMethodInfo *)EX_CONCAT(EX_EXPORTED_METHODS_PREFIX, EX_CONCAT(external_name, EX_CONCAT(__LINE__, __COUNTER__))) { \ 27 static EXMethodInfo config = {#external_name, #method}; \ 28 return &config; \ 29 } 30 31 #define EX_VIEW_PROPERTY(external_name, type, viewClass) \ 32 - (void)EX_CONCAT(EX_PROPSETTERS_PREFIX, external_name):(type)value view:(viewClass *)view 33 34 #define _EX_DEFINE_CUSTOM_LOAD(_custom_load_code) \ 35 EX_EXTERN void EXRegisterModule(Class); \ 36 + (void)load { \ 37 EXRegisterModule(self); \ 38 _custom_load_code \ 39 } 40 41 #define EX_EXPORT_MODULE_WITH_CUSTOM_LOAD(external_name, _custom_load_code) \ 42 _EX_DEFINE_CUSTOM_LOAD(_custom_load_code) \ 43 + (const NSString *)exportedModuleName { return @#external_name; } 44 45 #define EX_EXPORT_MODULE(external_name) \ 46 EX_EXPORT_MODULE_WITH_CUSTOM_LOAD(external_name,) 47 48 #define EX_REGISTER_MODULE(_custom_load_code) \ 49 _EX_DEFINE_CUSTOM_LOAD(_custom_load_code) 50 51 #define EX_REGISTER_SINGLETON_MODULE_WITH_CUSTOM_LOAD(singleton_name, _custom_load_code) \ 52 EX_EXTERN void EXRegisterSingletonModule(Class); \ 53 + (const NSString *)name { \ 54 return @#singleton_name; \ 55 } \ 56 \ 57 + (void)load { \ 58 EXRegisterSingletonModule(self); \ 59 _custom_load_code \ 60 } 61 62 #define EX_REGISTER_SINGLETON_MODULE(singleton_name) \ 63 EX_REGISTER_SINGLETON_MODULE_WITH_CUSTOM_LOAD(singleton_name,) 64 65 #define EX_WEAKIFY(var) \ 66 __weak __typeof(var) EXWeak_##var = var; 67 68 #define EX_STRONGIFY(var) \ 69 _Pragma("clang diagnostic push") \ 70 _Pragma("clang diagnostic ignored \"-Wshadow\"") \ 71 __strong __typeof(var) var = EXWeak_##var; \ 72 _Pragma("clang diagnostic pop") 73 74 #define EX_ENSURE_STRONGIFY(var) \ 75 EX_STRONGIFY(var); \ 76 if (var == nil) { return; } 77 78 // Converts nil -> [NSNull null] 79 #define EXNullIfNil(value) (value ?: [NSNull null]) 80 81 #import <UIKit/UIKit.h> 82 #import <Foundation/Foundation.h> 83 84 typedef struct EXMethodInfo { 85 const char *const jsName; 86 const char *const objcName; 87 } EXMethodInfo; 88 89 typedef struct EXModuleInfo { 90 const char *const jsName; 91 const char *const internalName; 92 } EXModuleInfo; 93 94 typedef void (^EXDirectEventBlock)(NSDictionary *body); 95 typedef void (^EXPromiseResolveBlock)(id result); 96 typedef void (^EXPromiseRejectBlock)(NSString *code, NSString *message, NSError *error); 97 98 #pragma mark - Externs 99 100 // These should be defined by the concrete platform adapter 101 EX_EXTERN void EXLogInfo(NSString *format, ...); 102 EX_EXTERN void EXLogWarn(NSString *format, ...); 103 EX_EXTERN void EXLogError(NSString *format, ...); 104 EX_EXTERN void EXFatal(NSError *); 105 EX_EXTERN NSError * EXErrorWithMessage(NSString *); 106 EX_EXTERN UIApplication *EXSharedApplication(void); 107 108 EX_EXTERN_C_END 109