2015-03-23 20:28:42 +00:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2015-02-20 04:10:52 +00:00
|
|
|
|
|
|
|
#import <Foundation/Foundation.h>
|
|
|
|
|
2015-04-21 12:26:51 +00:00
|
|
|
#import "RCTDefines.h"
|
2015-02-20 04:10:52 +00:00
|
|
|
|
2015-04-11 22:08:00 +00:00
|
|
|
/**
|
|
|
|
* The default error domain to be used for React errors.
|
|
|
|
*/
|
2015-08-07 13:06:17 +00:00
|
|
|
RCT_EXTERN NSString *const RCTErrorDomain;
|
2015-02-20 04:10:52 +00:00
|
|
|
|
2015-04-11 22:08:00 +00:00
|
|
|
/**
|
|
|
|
* A block signature to be used for custom assertion handling.
|
|
|
|
*/
|
|
|
|
typedef void (^RCTAssertFunction)(
|
2015-08-07 13:06:17 +00:00
|
|
|
NSString *condition,
|
2015-04-11 22:08:00 +00:00
|
|
|
NSString *fileName,
|
|
|
|
NSNumber *lineNumber,
|
|
|
|
NSString *function,
|
|
|
|
NSString *message
|
|
|
|
);
|
2015-02-20 04:10:52 +00:00
|
|
|
|
2015-04-11 22:08:00 +00:00
|
|
|
/**
|
|
|
|
* This is the main assert macro that you should use.
|
|
|
|
*/
|
2015-08-07 13:06:17 +00:00
|
|
|
#define RCTAssert(condition, ...) do { \
|
|
|
|
if ((condition) == 0) { \
|
|
|
|
_RCTAssertFormat(#condition, __FILE__, __LINE__, __func__, __VA_ARGS__); \
|
|
|
|
if (RCT_NSASSERT) { \
|
|
|
|
[[NSAssertionHandler currentHandler] handleFailureInFunction:@(__func__) \
|
|
|
|
file:@(__FILE__) lineNumber:__LINE__ description:__VA_ARGS__]; \
|
|
|
|
} \
|
|
|
|
} \
|
2015-02-20 04:10:52 +00:00
|
|
|
} while (false)
|
2015-08-07 13:06:17 +00:00
|
|
|
RCT_EXTERN void _RCTAssertFormat(
|
|
|
|
const char *, const char *, int, const char *, NSString *, ...
|
|
|
|
) NS_FORMAT_FUNCTION(5,6);
|
2015-06-15 14:53:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Convenience macro for asserting that a parameter is non-nil/non-zero.
|
|
|
|
*/
|
|
|
|
#define RCTAssertParam(name) RCTAssert(name, \
|
|
|
|
@"'%s' is a required parameter", #name)
|
2015-02-20 04:10:52 +00:00
|
|
|
|
2015-04-11 22:08:00 +00:00
|
|
|
/**
|
|
|
|
* Convenience macro for asserting that we're running on main thread.
|
|
|
|
*/
|
|
|
|
#define RCTAssertMainThread() RCTAssert([NSThread isMainThread], \
|
2015-06-15 14:53:45 +00:00
|
|
|
@"This function must be called on the main thread")
|
2015-04-11 22:08:00 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* These methods get and set the current assert function called by the RCTAssert
|
|
|
|
* macros. You can use these to replace the standard behavior with custom log
|
|
|
|
* functionality.
|
|
|
|
*/
|
2015-04-21 12:26:51 +00:00
|
|
|
RCT_EXTERN void RCTSetAssertFunction(RCTAssertFunction assertFunction);
|
|
|
|
RCT_EXTERN RCTAssertFunction RCTGetAssertFunction(void);
|
2015-04-11 22:08:00 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This appends additional code to the existing assert function, without
|
|
|
|
* replacing the existing functionality. Useful if you just want to forward
|
|
|
|
* assert info to an extra service without changing the default behavior.
|
|
|
|
*/
|
2015-04-21 12:26:51 +00:00
|
|
|
RCT_EXTERN void RCTAddAssertFunction(RCTAssertFunction assertFunction);
|
2015-05-25 12:19:53 +00:00
|
|
|
|
2015-08-07 13:06:17 +00:00
|
|
|
/**
|
|
|
|
* This method temporarily overrides the assert function while performing the
|
|
|
|
* specified block. This is useful for testing purposes (to detect if a given
|
|
|
|
* function asserts something) or to suppress or override assertions temporarily.
|
|
|
|
*/
|
|
|
|
RCT_EXTERN void RCTPerformBlockWithAssertFunction(void (^block)(void), RCTAssertFunction assertFunction);
|
|
|
|
|
2015-05-25 12:19:53 +00:00
|
|
|
/**
|
|
|
|
* Get the current thread's name (or the current queue, if in debug mode)
|
|
|
|
*/
|
|
|
|
RCT_EXTERN NSString *RCTCurrentThreadName(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convenience macro to assert which thread is currently running (DEBUG mode only)
|
|
|
|
*/
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
#define RCTAssertThread(thread, format...) \
|
|
|
|
_Pragma("clang diagnostic push") \
|
|
|
|
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \
|
|
|
|
RCTAssert( \
|
|
|
|
[(id)thread isKindOfClass:[NSString class]] ? \
|
|
|
|
[RCTCurrentThreadName() isEqualToString:(NSString *)thread] : \
|
|
|
|
[(id)thread isKindOfClass:[NSThread class]] ? \
|
|
|
|
[NSThread currentThread] == (NSThread *)thread : \
|
|
|
|
dispatch_get_current_queue() == (dispatch_queue_t)thread, \
|
|
|
|
format); \
|
|
|
|
_Pragma("clang diagnostic pop")
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define RCTAssertThread(thread, format...)
|
|
|
|
|
|
|
|
#endif
|