1 /* 2 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef WTF_Assertions_h 27 #define WTF_Assertions_h 28 29 /* 30 no namespaces because this file has to be includable from C and Objective-C 31 32 Note, this file uses many GCC extensions, but it should be compatible with 33 C, Objective C, C++, and Objective C++. 34 35 For non-debug builds, everything is disabled by default. 36 Defining any of the symbols explicitly prevents this from having any effect. 37 38 MSVC7 note: variadic macro support was added in MSVC8, so for now we disable 39 those macros in MSVC7. For more info, see the MSDN document on variadic 40 macros here: 41 42 http://msdn2.microsoft.com/en-us/library/ms177415(VS.80).aspx 43 */ 44 45 #include "Platform.h" 46 47 #if COMPILER(MSVC) 48 #include <stddef.h> 49 #else 50 #include <inttypes.h> 51 #endif 52 53 #ifdef NDEBUG 54 #define ASSERTIONS_DISABLED_DEFAULT 1 55 #else 56 #define ASSERTIONS_DISABLED_DEFAULT 0 57 #endif 58 59 #ifndef ASSERT_DISABLED 60 #define ASSERT_DISABLED ASSERTIONS_DISABLED_DEFAULT 61 #endif 62 63 #ifndef ASSERT_ARG_DISABLED 64 #define ASSERT_ARG_DISABLED ASSERTIONS_DISABLED_DEFAULT 65 #endif 66 67 #ifndef FATAL_DISABLED 68 #define FATAL_DISABLED ASSERTIONS_DISABLED_DEFAULT 69 #endif 70 71 #ifndef ERROR_DISABLED 72 #define ERROR_DISABLED ASSERTIONS_DISABLED_DEFAULT 73 #endif 74 75 #ifndef LOG_DISABLED 76 #define LOG_DISABLED ASSERTIONS_DISABLED_DEFAULT 77 #endif 78 79 #if COMPILER(GCC) 80 #define WTF_PRETTY_FUNCTION __PRETTY_FUNCTION__ 81 #else 82 #define WTF_PRETTY_FUNCTION __FUNCTION__ 83 #endif 84 85 /* WTF logging functions can process %@ in the format string to log a NSObject* but the printf format attribute 86 emits a warning when %@ is used in the format string. Until <rdar://problem/5195437> is resolved we can't include 87 the attribute when being used from Objective-C code in case it decides to use %@. */ 88 #if COMPILER(GCC) && !defined(__OBJC__) 89 #define WTF_ATTRIBUTE_PRINTF(formatStringArgument, extraArguments) __attribute__((__format__(printf, formatStringArgument, extraArguments))) 90 #else 91 #define WTF_ATTRIBUTE_PRINTF(formatStringArgument, extraArguments) 92 #endif 93 94 /* These helper functions are always declared, but not necessarily always defined if the corresponding function is disabled. */ 95 96 #ifdef __cplusplus 97 extern "C" { 98 #endif 99 100 typedef enum { WTFLogChannelOff, WTFLogChannelOn } WTFLogChannelState; 101 102 typedef struct { 103 unsigned mask; 104 const char *defaultName; 105 WTFLogChannelState state; 106 } WTFLogChannel; 107 108 void WTFReportAssertionFailure(const char* file, int line, const char* function, const char* assertion); 109 void WTFReportAssertionFailureWithMessage(const char* file, int line, const char* function, const char* assertion, const char* format, ...) WTF_ATTRIBUTE_PRINTF(5, 6); 110 void WTFReportArgumentAssertionFailure(const char* file, int line, const char* function, const char* argName, const char* assertion); 111 void WTFReportFatalError(const char* file, int line, const char* function, const char* format, ...) WTF_ATTRIBUTE_PRINTF(4, 5); 112 void WTFReportError(const char* file, int line, const char* function, const char* format, ...) WTF_ATTRIBUTE_PRINTF(4, 5); 113 void WTFLog(WTFLogChannel* channel, const char* format, ...) WTF_ATTRIBUTE_PRINTF(2, 3); 114 void WTFLogVerbose(const char* file, int line, const char* function, WTFLogChannel* channel, const char* format, ...) WTF_ATTRIBUTE_PRINTF(5, 6); 115 116 #ifdef __cplusplus 117 } 118 #endif 119 120 /* CRASH -- gets us into the debugger or the crash reporter -- signals are ignored by the crash reporter so we must do better */ 121 122 #ifndef CRASH 123 #define CRASH() do { \ 124 *(int *)(uintptr_t)0xbbadbeef = 0; \ 125 ((void(*)())0)(); /* More reliable, but doesn't say BBADBEEF */ \ 126 } while(false) 127 #endif 128 129 /* ASSERT, ASSERT_WITH_MESSAGE, ASSERT_NOT_REACHED */ 130 131 #if PLATFORM(WINCE) && !PLATFORM(TORCHMOBILE) 132 /* FIXME: We include this here only to avoid a conflict with the ASSERT macro. */ 133 #include <windows.h> 134 #undef min 135 #undef max 136 #undef ERROR 137 #endif 138 139 #if PLATFORM(WIN_OS) || PLATFORM(SYMBIAN) 140 /* FIXME: Change to use something other than ASSERT to avoid this conflict with the underlying platform */ 141 #undef ASSERT 142 #endif 143 144 #if ASSERT_DISABLED 145 146 #define ASSERT(assertion) ((void)0) 147 #define ASSERT_WITH_MESSAGE(assertion, ...) ((void)0) 148 #define ASSERT_NOT_REACHED() ((void)0) 149 #define ASSERT_UNUSED(variable, assertion) ((void)variable) 150 151 #else 152 153 #define ASSERT(assertion) do \ 154 if (!(assertion)) { \ 155 WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #assertion); \ 156 CRASH(); \ 157 } \ 158 while (0) 159 #if COMPILER(MSVC7) 160 #define ASSERT_WITH_MESSAGE(assertion) ((void)0) 161 #else 162 #define ASSERT_WITH_MESSAGE(assertion, ...) do \ 163 if (!(assertion)) { \ 164 WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #assertion, __VA_ARGS__); \ 165 CRASH(); \ 166 } \ 167 while (0) 168 #endif /* COMPILER(MSVC7) */ 169 #define ASSERT_NOT_REACHED() do { \ 170 WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, 0); \ 171 CRASH(); \ 172 } while (0) 173 174 #define ASSERT_UNUSED(variable, assertion) ASSERT(assertion) 175 176 #endif 177 178 /* ASSERT_ARG */ 179 180 #if ASSERT_ARG_DISABLED 181 182 #define ASSERT_ARG(argName, assertion) ((void)0) 183 184 #else 185 186 #define ASSERT_ARG(argName, assertion) do \ 187 if (!(assertion)) { \ 188 WTFReportArgumentAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #argName, #assertion); \ 189 CRASH(); \ 190 } \ 191 while (0) 192 193 #endif 194 195 /* COMPILE_ASSERT */ 196 #ifndef COMPILE_ASSERT 197 #define COMPILE_ASSERT(exp, name) typedef int dummy##name [(exp) ? 1 : -1] 198 #endif 199 200 /* FATAL */ 201 202 #if FATAL_DISABLED 203 #define FATAL(...) ((void)0) 204 #elif COMPILER(MSVC7) 205 #define FATAL() ((void)0) 206 #else 207 #define FATAL(...) do { \ 208 WTFReportFatalError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__); \ 209 CRASH(); \ 210 } while (0) 211 #endif 212 213 /* LOG_ERROR */ 214 215 #if ERROR_DISABLED 216 #define LOG_ERROR(...) ((void)0) 217 #elif COMPILER(MSVC7) 218 #define LOG_ERROR() ((void)0) 219 #else 220 #define LOG_ERROR(...) WTFReportError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__) 221 #endif 222 223 /* LOG */ 224 225 #if LOG_DISABLED 226 #define LOG(channel, ...) ((void)0) 227 #elif COMPILER(MSVC7) 228 #define LOG() ((void)0) 229 #else 230 #define LOG(channel, ...) WTFLog(&JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__) 231 #define JOIN_LOG_CHANNEL_WITH_PREFIX(prefix, channel) JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) 232 #define JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) prefix ## channel 233 #endif 234 235 /* LOG_VERBOSE */ 236 237 #if LOG_DISABLED 238 #define LOG_VERBOSE(channel, ...) ((void)0) 239 #elif COMPILER(MSVC7) 240 #define LOG_VERBOSE(channel) ((void)0) 241 #else 242 #define LOG_VERBOSE(channel, ...) WTFLogVerbose(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, &JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__) 243 #endif 244 245 #endif /* WTF_Assertions_h */ 246