Home | History | Annotate | Download | only in wtf
      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