2006-04-04 Eric Seidel <eseidel@apple.com>
[WebKit-https.git] / JavaScriptCore / kxmlcore / Assertions.h
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  * Copyright (C) 2003, 2006 Apple Computer, Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #ifndef KXMLCORE_ASSERTIONS_H
28 #define KXMLCORE_ASSERTIONS_H
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 #ifdef NDEBUG
39 #define ASSERTIONS_DISABLED_DEFAULT 1
40 #else
41 #define ASSERTIONS_DISABLED_DEFAULT 0
42 #endif
43
44 #ifndef ASSERT_DISABLED
45 #define ASSERT_DISABLED ASSERTIONS_DISABLED_DEFAULT
46 #endif
47
48 #ifndef ASSERT_ARG_DISABLED
49 #define ASSERT_ARG_DISABLED ASSERTIONS_DISABLED_DEFAULT
50 #endif
51
52 #ifndef FATAL_DISABLED
53 #define FATAL_DISABLED ASSERTIONS_DISABLED_DEFAULT
54 #endif
55
56 #ifndef ERROR_DISABLED
57 #define ERROR_DISABLED ASSERTIONS_DISABLED_DEFAULT
58 #endif
59
60 #ifndef LOG_DISABLED
61 #define LOG_DISABLED ASSERTIONS_DISABLED_DEFAULT
62 #endif
63
64 #if COMPILER(GCC)
65 #define KXMLCORE_PRETTY_FUNCTION __PRETTY_FUNCTION__
66 #else
67 #define KXMLCORE_PRETTY_FUNCTION __FUNCTION__
68 #endif
69
70 // These helper functions are always declared, but not necessarily always defined if the corresponding function is disabled.
71
72 #ifdef __cplusplus
73 extern "C" {
74 #endif
75
76 typedef enum { KXCLogChannelOff, KXCLogChannelOn } KXCLogChannelState;
77
78 typedef struct {
79     unsigned mask;
80     const char *defaultName;
81     KXCLogChannelState state;
82 } KXCLogChannel;
83
84 void KXCReportAssertionFailure(const char *file, int line, const char *function, const char *assertion);
85 void KXCReportAssertionFailureWithMessage(const char *file, int line, const char *function, const char *assertion, const char *format, ...);
86 void KXCReportArgumentAssertionFailure(const char *file, int line, const char *function, const char *argName, const char *assertion);
87 void KXCReportFatalError(const char *file, int line, const char *function, const char *format, ...) ;
88 void KXCReportError(const char *file, int line, const char *function, const char *format, ...);
89 void KXCLog(const char *file, int line, const char *function, KXCLogChannel *channel, const char *format, ...);
90
91 #ifdef __cplusplus
92 }
93 #endif
94
95 // CRASH -- gets us into the debugger or the crash reporter -- signals are ignored by the crash reporter so we must do better
96
97 #define CRASH() *(int *)0xbbadbeef = 0
98
99 // ASSERT, ASSERT_WITH_MESSAGE, ASSERT_NOT_REACHED
100
101 #if PLATFORM(WIN_OS)
102 // FIXME: Change to use something other than ASSERT to avoid this conflict with win32.
103 #undef ASSERT
104 #endif
105
106 #if ASSERT_DISABLED
107
108 #define ASSERT(assertion) ((void)0)
109 #define ASSERT_WITH_MESSAGE(assertion, ...) ((void)0)
110 #define ASSERT_NOT_REACHED() ((void)0)
111
112 #else
113
114 #define ASSERT(assertion) do \
115     if (!(assertion)) { \
116         KXCReportAssertionFailure(__FILE__, __LINE__, KXMLCORE_PRETTY_FUNCTION, #assertion); \
117         CRASH(); \
118     } \
119 while (0)
120 #define ASSERT_WITH_MESSAGE(assertion, ...) do \
121     if (!(assertion)) { \
122         KXCReportAssertionFailureWithMessage(__FILE__, __LINE__, KXMLCORE_PRETTY_FUNCTION, #assertion, __VA_ARGS__); \
123         CRASH(); \
124     } \
125 while (0)
126 #define ASSERT_NOT_REACHED() do { \
127     KXCReportAssertionFailure(__FILE__, __LINE__, KXMLCORE_PRETTY_FUNCTION, 0); \
128     CRASH(); \
129 } while (0)
130
131 #endif
132
133 // ASSERT_ARG
134
135 #if ASSERT_ARG_DISABLED
136
137 #define ASSERT_ARG(argName, assertion) ((void)0)
138
139 #else
140
141 #define ASSERT_ARG(argName, assertion) do \
142     if (!(assertion)) { \
143         KXCReportArgumentAssertionFailure(__FILE__, __LINE__, KXMLCORE_PRETTY_FUNCTION, #argName, #assertion); \
144         CRASH(); \
145     } \
146 while (0)
147
148 #endif
149
150 // FATAL
151
152 #if FATAL_DISABLED
153 #define FATAL(...) ((void)0)
154 #else
155 #define FATAL(...) do { \
156     KXCReportFatalError(__FILE__, __LINE__, KXMLCORE_PRETTY_FUNCTION, __VA_ARGS__); \
157     CRASH(); \
158 } while (0)
159 #endif
160
161 // LOG_ERROR
162
163 #if ERROR_DISABLED
164 #define LOG_ERROR(...) ((void)0)
165 #else
166 #define LOG_ERROR(...) KXCReportError(__FILE__, __LINE__, KXMLCORE_PRETTY_FUNCTION, __VA_ARGS__)
167 #endif
168
169 // LOG
170
171 #if LOG_DISABLED
172 #define LOG(channel, ...) ((void)0)
173 #else
174 #define LOG(channel, ...) KXCLog(__FILE__, __LINE__, KXMLCORE_PRETTY_FUNCTION, &JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__)
175 #define JOIN_LOG_CHANNEL_WITH_PREFIX(prefix, channel) JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel)
176 #define JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) prefix ## channel
177 #endif
178
179 #endif // KXMLCORE_ASSERTIONS_H