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 #if OS(SYMBIAN) 54 #include <e32def.h> 55 #include <e32debug.h> 56 #endif 57 58 #ifdef NDEBUG 59 #define ASSERTIONS_DISABLED_DEFAULT 1 60 #else 61 #define ASSERTIONS_DISABLED_DEFAULT 0 62 #endif 63 64 #if COMPILER(MSVC7) || COMPILER(WINSCW) 65 #define HAVE_VARIADIC_MACRO 0 66 #else 67 #define HAVE_VARIADIC_MACRO 1 68 #endif 69 70 #ifndef ASSERT_DISABLED 71 #define ASSERT_DISABLED ASSERTIONS_DISABLED_DEFAULT 72 #endif 73 74 #ifndef ASSERT_MSG_DISABLED 75 #if HAVE(VARIADIC_MACRO) 76 #define ASSERT_MSG_DISABLED ASSERTIONS_DISABLED_DEFAULT 77 #else 78 #define ASSERT_MSG_DISABLED 1 79 #endif 80 #endif 81 82 #ifndef ASSERT_ARG_DISABLED 83 #define ASSERT_ARG_DISABLED ASSERTIONS_DISABLED_DEFAULT 84 #endif 85 86 #ifndef FATAL_DISABLED 87 #if HAVE(VARIADIC_MACRO) 88 #define FATAL_DISABLED ASSERTIONS_DISABLED_DEFAULT 89 #else 90 #define FATAL_DISABLED 1 91 #endif 92 #endif 93 94 #ifndef ERROR_DISABLED 95 #if HAVE(VARIADIC_MACRO) 96 #define ERROR_DISABLED ASSERTIONS_DISABLED_DEFAULT 97 #else 98 #define ERROR_DISABLED 1 99 #endif 100 #endif 101 102 #ifndef LOG_DISABLED 103 #if HAVE(VARIADIC_MACRO) 104 #define LOG_DISABLED ASSERTIONS_DISABLED_DEFAULT 105 #else 106 #define LOG_DISABLED 1 107 #endif 108 #endif 109 110 #if COMPILER(GCC) 111 #define WTF_PRETTY_FUNCTION __PRETTY_FUNCTION__ 112 #else 113 #define WTF_PRETTY_FUNCTION __FUNCTION__ 114 #endif 115 116 /* WTF logging functions can process %@ in the format string to log a NSObject* but the printf format attribute 117 emits a warning when %@ is used in the format string. Until <rdar://problem/5195437> is resolved we can't include 118 the attribute when being used from Objective-C code in case it decides to use %@. */ 119 #if COMPILER(GCC) && !defined(__OBJC__) 120 #define WTF_ATTRIBUTE_PRINTF(formatStringArgument, extraArguments) __attribute__((__format__(printf, formatStringArgument, extraArguments))) 121 #else 122 #define WTF_ATTRIBUTE_PRINTF(formatStringArgument, extraArguments) 123 #endif 124 125 /* These helper functions are always declared, but not necessarily always defined if the corresponding function is disabled. */ 126 127 #ifdef __cplusplus 128 extern "C" { 129 #endif 130 131 typedef enum { WTFLogChannelOff, WTFLogChannelOn } WTFLogChannelState; 132 133 typedef struct { 134 unsigned mask; 135 const char *defaultName; 136 WTFLogChannelState state; 137 } WTFLogChannel; 138 139 void WTFReportAssertionFailure(const char* file, int line, const char* function, const char* assertion); 140 void WTFReportAssertionFailureWithMessage(const char* file, int line, const char* function, const char* assertion, const char* format, ...) WTF_ATTRIBUTE_PRINTF(5, 6); 141 void WTFReportArgumentAssertionFailure(const char* file, int line, const char* function, const char* argName, const char* assertion); 142 void WTFReportFatalError(const char* file, int line, const char* function, const char* format, ...) WTF_ATTRIBUTE_PRINTF(4, 5); 143 void WTFReportError(const char* file, int line, const char* function, const char* format, ...) WTF_ATTRIBUTE_PRINTF(4, 5); 144 void WTFLog(WTFLogChannel* channel, const char* format, ...) WTF_ATTRIBUTE_PRINTF(2, 3); 145 void WTFLogVerbose(const char* file, int line, const char* function, WTFLogChannel* channel, const char* format, ...) WTF_ATTRIBUTE_PRINTF(5, 6); 146 147 #ifdef __cplusplus 148 } 149 #endif 150 151 /* CRASH -- gets us into the debugger or the crash reporter -- signals are ignored by the crash reporter so we must do better */ 152 153 #ifndef CRASH 154 #if OS(SYMBIAN) 155 #define CRASH() do { \ 156 __DEBUGGER(); \ 157 User::Panic(_L("Webkit CRASH"),0); \ 158 } while(false) 159 #else 160 #define CRASH() do { \ 161 *(int *)(uintptr_t)0xbbadbeef = 0; \ 162 ((void(*)())0)(); /* More reliable, but doesn't say BBADBEEF */ \ 163 } while(false) 164 #endif 165 #endif 166 167 /* ASSERT, ASSERT_NOT_REACHED, ASSERT_UNUSED */ 168 169 #if OS(WINCE) && !PLATFORM(TORCHMOBILE) 170 /* FIXME: We include this here only to avoid a conflict with the ASSERT macro. */ 171 #include <windows.h> 172 #undef min 173 #undef max 174 #undef ERROR 175 #endif 176 177 #if OS(WINDOWS) || OS(SYMBIAN) 178 /* FIXME: Change to use something other than ASSERT to avoid this conflict with the underlying platform */ 179 #undef ASSERT 180 #endif 181 182 #if PLATFORM(BREWMP) 183 /* FIXME: We include this here only to avoid a conflict with the COMPILE_ASSERT macro. */ 184 #include <AEEClassIDs.h> 185 186 /* FIXME: Change to use something other than COMPILE_ASSERT to avoid this conflict with the underlying platform */ 187 #undef COMPILE_ASSERT 188 #endif 189 190 #if ASSERT_DISABLED 191 192 #define ASSERT(assertion) ((void)0) 193 #define ASSERT_NOT_REACHED() ((void)0) 194 #define ASSERT_UNUSED(variable, assertion) ((void)variable) 195 196 #else 197 198 #define ASSERT(assertion) do \ 199 if (!(assertion)) { \ 200 WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #assertion); \ 201 CRASH(); \ 202 } \ 203 while (0) 204 205 #define ASSERT_NOT_REACHED() do { \ 206 WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, 0); \ 207 CRASH(); \ 208 } while (0) 209 210 #define ASSERT_UNUSED(variable, assertion) ASSERT(assertion) 211 212 #endif 213 214 /* ASSERT_WITH_MESSAGE */ 215 216 #if COMPILER(MSVC7) 217 #define ASSERT_WITH_MESSAGE(assertion) ((void)0) 218 #elif COMPILER(WINSCW) 219 #define ASSERT_WITH_MESSAGE(assertion, arg...) ((void)0) 220 #elif ASSERT_MSG_DISABLED 221 #define ASSERT_WITH_MESSAGE(assertion, ...) ((void)0) 222 #else 223 #define ASSERT_WITH_MESSAGE(assertion, ...) do \ 224 if (!(assertion)) { \ 225 WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #assertion, __VA_ARGS__); \ 226 CRASH(); \ 227 } \ 228 while (0) 229 #endif 230 231 232 /* ASSERT_ARG */ 233 234 #if ASSERT_ARG_DISABLED 235 236 #define ASSERT_ARG(argName, assertion) ((void)0) 237 238 #else 239 240 #define ASSERT_ARG(argName, assertion) do \ 241 if (!(assertion)) { \ 242 WTFReportArgumentAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #argName, #assertion); \ 243 CRASH(); \ 244 } \ 245 while (0) 246 247 #endif 248 249 /* COMPILE_ASSERT */ 250 #ifndef COMPILE_ASSERT 251 #define COMPILE_ASSERT(exp, name) typedef int dummy##name [(exp) ? 1 : -1] 252 #endif 253 254 /* FATAL */ 255 256 #if COMPILER(MSVC7) 257 #define FATAL() ((void)0) 258 #elif COMPILER(WINSCW) 259 #define FATAL(arg...) ((void)0) 260 #elif FATAL_DISABLED 261 #define FATAL(...) ((void)0) 262 #else 263 #define FATAL(...) do { \ 264 WTFReportFatalError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__); \ 265 CRASH(); \ 266 } while (0) 267 #endif 268 269 /* LOG_ERROR */ 270 271 #if COMPILER(MSVC7) 272 #define LOG_ERROR() ((void)0) 273 #elif COMPILER(WINSCW) 274 #define LOG_ERROR(arg...) ((void)0) 275 #elif ERROR_DISABLED 276 #define LOG_ERROR(...) ((void)0) 277 #else 278 #define LOG_ERROR(...) WTFReportError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__) 279 #endif 280 281 /* LOG */ 282 283 #if COMPILER(MSVC7) 284 #define LOG() ((void)0) 285 #elif COMPILER(WINSCW) 286 #define LOG(arg...) ((void)0) 287 #elif LOG_DISABLED 288 #define LOG(channel, ...) ((void)0) 289 #else 290 #define LOG(channel, ...) WTFLog(&JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__) 291 #define JOIN_LOG_CHANNEL_WITH_PREFIX(prefix, channel) JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) 292 #define JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) prefix ## channel 293 #endif 294 295 /* LOG_VERBOSE */ 296 297 #if COMPILER(MSVC7) 298 #define LOG_VERBOSE(channel) ((void)0) 299 #elif COMPILER(WINSCW) 300 #define LOG_VERBOSE(channel, arg...) ((void)0) 301 #elif LOG_DISABLED 302 #define LOG_VERBOSE(channel, ...) ((void)0) 303 #else 304 #define LOG_VERBOSE(channel, ...) WTFLogVerbose(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, &JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__) 305 #endif 306 307 #endif /* WTF_Assertions_h */ 308