Mercurial > sdl-ios-xcode
comparison include/SDL_assert.h @ 3655:1cc7f0143c12
Moved SDL_FUNCTION out so it's always available, and added SDL_FILE and SDL_LINE
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 13 Jan 2010 08:25:16 +0000 |
parents | 336f3df1578d |
children | 97114af2f8dc |
comparison
equal
deleted
inserted
replaced
3654:336f3df1578d | 3655:1cc7f0143c12 |
---|---|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
18 | 18 |
19 Sam Lantinga | 19 Sam Lantinga |
20 slouken@libsdl.org | 20 slouken@libsdl.org |
21 */ | 21 */ |
22 #include "SDL_config.h" | |
23 | 22 |
24 #ifndef _SDL_assert_h | 23 #ifndef _SDL_assert_h |
25 #define _SDL_assert_h | 24 #define _SDL_assert_h |
25 | |
26 #include "SDL_config.h" | |
27 | |
28 #include "begin_code.h" | |
29 /* Set up for C function definitions, even when using C++ */ | |
30 #ifdef __cplusplus | |
31 /* *INDENT-OFF* */ | |
32 extern "C" { | |
33 /* *INDENT-ON* */ | |
34 #endif | |
26 | 35 |
27 #ifndef SDL_ASSERT_LEVEL | 36 #ifndef SDL_ASSERT_LEVEL |
28 #ifdef SDL_DEFAULT_ASSERT_LEVEL | 37 #ifdef SDL_DEFAULT_ASSERT_LEVEL |
29 #define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL | 38 #define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL |
30 #elif defined(_DEBUG) || defined(DEBUG) || \ | 39 #elif defined(_DEBUG) || defined(DEBUG) || \ |
32 #define SDL_ASSERT_LEVEL 2 | 41 #define SDL_ASSERT_LEVEL 2 |
33 #else | 42 #else |
34 #define SDL_ASSERT_LEVEL 1 | 43 #define SDL_ASSERT_LEVEL 1 |
35 #endif | 44 #endif |
36 #endif /* SDL_ASSERT_LEVEL */ | 45 #endif /* SDL_ASSERT_LEVEL */ |
46 | |
47 /* | |
48 These are macros and not first class functions so that the debugger breaks | |
49 on the assertion line and not in some random guts of SDL, and so each | |
50 macro can have unique static variables associated with it. | |
51 */ | |
52 | |
53 #if (defined(_MSC_VER) && ((_M_IX86) || (_M_X64))) | |
54 #define SDL_TriggerBreakpoint() __asm { int 3 } | |
55 #elif (defined(__GNUC__) && ((__i386__) || (__x86_64__))) | |
56 #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) | |
57 #elif defined(HAVE_SIGNAL_H) | |
58 #include <signal.h> | |
59 #define SDL_TriggerBreakpoint() raise(SIGTRAP) | |
60 #else | |
61 /* How do we trigger breakpoints on this platform? */ | |
62 #define SDL_TriggerBreakpoint() | |
63 #endif | |
64 | |
65 #if (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ | |
66 # define SDL_FUNCTION __func__ | |
67 #elif ((__GNUC__ >= 2) || defined(_MSC_VER)) | |
68 # define SDL_FUNCTION __FUNCTION__ | |
69 #else | |
70 # define SDL_FUNCTION "???" | |
71 #endif | |
72 #define SDL_FILE __FILE__ | |
73 #define SDL_LINE __LINE__ | |
37 | 74 |
38 /* | 75 /* |
39 sizeof (x) makes the compiler still parse the expression even without | 76 sizeof (x) makes the compiler still parse the expression even without |
40 assertions enabled, so the code is always checked at compile time, but | 77 assertions enabled, so the code is always checked at compile time, but |
41 doesn't actually generate code for it, so there are no side effects or | 78 doesn't actually generate code for it, so there are no side effects or |
53 #define SDL_disabled_assert(condition) \ | 90 #define SDL_disabled_assert(condition) \ |
54 do { (void) sizeof ((condition)); } while (0) | 91 do { (void) sizeof ((condition)); } while (0) |
55 | 92 |
56 #if (SDL_ASSERT_LEVEL > 0) | 93 #if (SDL_ASSERT_LEVEL > 0) |
57 | 94 |
58 /* | |
59 These are macros and not first class functions so that the debugger breaks | |
60 on the assertion line and not in some random guts of SDL, and so each | |
61 macro can have unique static variables associated with it. | |
62 */ | |
63 | |
64 #if (defined(_MSC_VER) && ((_M_IX86) || (_M_X64))) | |
65 #define SDL_TriggerBreakpoint() __asm { int 3 } | |
66 #elif (defined(__GNUC__) && ((__i386__) || (__x86_64__))) | |
67 #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) | |
68 #elif defined(HAVE_SIGNAL_H) | |
69 #include <signal.h> | |
70 #define SDL_TriggerBreakpoint() raise(SIGTRAP) | |
71 #else | |
72 #error Please define your platform or set SDL_ASSERT_LEVEL to 0. | |
73 #endif | |
74 | |
75 #if (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ | |
76 # define SDL_FUNCTION __func__ | |
77 #elif ((__GNUC__ >= 2) || defined(_MSC_VER)) | |
78 # define SDL_FUNCTION __FUNCTION__ | |
79 #else | |
80 # define SDL_FUNCTION "???" | |
81 #endif | |
82 | 95 |
83 typedef enum | 96 typedef enum |
84 { | 97 { |
85 SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */ | 98 SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */ |
86 SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */ | 99 SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */ |
98 int linenum; | 111 int linenum; |
99 const char *function; | 112 const char *function; |
100 struct SDL_assert_data *next; | 113 struct SDL_assert_data *next; |
101 } SDL_assert_data; | 114 } SDL_assert_data; |
102 | 115 |
103 SDL_assert_state SDL_ReportAssertion(SDL_assert_data *, const char *, int); | 116 extern DECLSPEC SDL_assert_state SDLCALL SDL_ReportAssertion(SDL_assert_data *, |
117 const char *, | |
118 const char *, int); | |
104 | 119 |
105 /* the do {} while(0) avoids dangling else problems: | 120 /* the do {} while(0) avoids dangling else problems: |
106 if (x) SDL_assert(y); else blah(); | 121 if (x) SDL_assert(y); else blah(); |
107 ... without the do/while, the "else" could attach to this macro's "if". | 122 ... without the do/while, the "else" could attach to this macro's "if". |
108 We try to handle just the minimum we need here in a macro...the loop, | 123 We try to handle just the minimum we need here in a macro...the loop, |
111 */ | 126 */ |
112 #define SDL_enabled_assert(condition) \ | 127 #define SDL_enabled_assert(condition) \ |
113 do { \ | 128 do { \ |
114 while ( !(condition) ) { \ | 129 while ( !(condition) ) { \ |
115 static struct SDL_assert_data assert_data = { \ | 130 static struct SDL_assert_data assert_data = { \ |
116 0, 0, #condition, __FILE__, 0, 0, 0 \ | 131 0, 0, #condition, 0, 0, 0, 0 \ |
117 }; \ | 132 }; \ |
118 const SDL_assert_state state = SDL_ReportAssertion(&assert_data, \ | 133 const SDL_assert_state state = SDL_ReportAssertion(&assert_data, \ |
119 SDL_FUNCTION, \ | 134 SDL_FUNCTION, \ |
120 __LINE__); \ | 135 SDL_FILE, \ |
136 SDL_LINE); \ | |
121 if (state == SDL_ASSERTION_RETRY) { \ | 137 if (state == SDL_ASSERTION_RETRY) { \ |
122 continue; /* go again. */ \ | 138 continue; /* go again. */ \ |
123 } else if (state == SDL_ASSERTION_BREAK) { \ | 139 } else if (state == SDL_ASSERTION_BREAK) { \ |
124 SDL_TriggerBreakpoint(); \ | 140 SDL_TriggerBreakpoint(); \ |
125 } \ | 141 } \ |
145 #elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */ | 161 #elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */ |
146 # define SDL_assert(condition) SDL_enabled_assert(condition) | 162 # define SDL_assert(condition) SDL_enabled_assert(condition) |
147 # define SDL_assert_release(condition) SDL_enabled_assert(condition) | 163 # define SDL_assert_release(condition) SDL_enabled_assert(condition) |
148 # define SDL_assert_paranoid(condition) SDL_enabled_assert(condition) | 164 # define SDL_assert_paranoid(condition) SDL_enabled_assert(condition) |
149 #else | 165 #else |
150 # error Unknown assertion level. Please fix your SDL_config.h. | 166 # error Unknown assertion level. |
151 #endif | 167 #endif |
168 | |
169 /* Ends C function definitions when using C++ */ | |
170 #ifdef __cplusplus | |
171 /* *INDENT-OFF* */ | |
172 } | |
173 /* *INDENT-ON* */ | |
174 #endif | |
175 #include "close_code.h" | |
152 | 176 |
153 #endif /* _SDL_assert_h */ | 177 #endif /* _SDL_assert_h */ |
154 | 178 |
155 /* vi: set ts=4 sw=4 expandtab: */ | 179 /* vi: set ts=4 sw=4 expandtab: */ |