1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: assert.h 4 5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 20704 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_ASSERT_H_ 17 #define NN_ASSERT_H_ 18 19 #include <nn/dbg/dbg_DebugString.h> 20 #include <nn/dbg/dbg_Break.h> 21 #include <nn/result.h> 22 #include <nn/config.h> 23 #include <nn/util/util_StaticAssert.h> 24 //TORIAEZU 25 #include <nn/os/os_MemoryMapSelect.h> 26 27 #include <cfloat> 28 29 30 // Assert 31 32 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING 33 #ifdef NN_SYSTEM_KERNEL 34 #define NN_ASSERTMSG(exp, ...) \ 35 (void) ((exp) || ( NN_LOG("Failed assertion at %s:%d\n ", NN_FILE_NAME, __LINE__), \ 36 NN_LOG(__VA_ARGS__), \ 37 NN_LOG("\n"), \ 38 ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 39 0) ) 40 #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) \ 41 (void) ((exp) || ( NN_LOG("Result Assertion cannot be used on Kernel at %s:%d\n ", NN_FILE_NAME, __LINE__), \ 42 NN_LOG(__VA_ARGS__), \ 43 NN_LOG("\n"), \ 44 ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 45 0) ) 46 #else 47 #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT 48 #define NN_ASSERTMSG(exp, ...) \ 49 (void) ((exp) || nndbgAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__)) 50 #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) \ 51 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__)) 52 #else 53 #define NN_ASSERTMSG(exp, ...) \ 54 (void) ((exp) || nndbgAssertionFailureHandler(false, NULL, __LINE__, NULL)) 55 #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) \ 56 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL)) 57 #endif 58 #endif 59 #else 60 #define NN_ASSERTMSG(exp, ...) ((void)0) 61 #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) ((void)0) 62 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING 63 64 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK 65 #ifdef NN_SYSTEM_KERNEL 66 #define NN_TASSERTMSG_(exp, ...) \ 67 (void) ((exp) || ( NN_TLOG_("Failed assertion at %s:%d\n ", NN_FILE_NAME, __LINE__), \ 68 NN_TLOG_(__VA_ARGS__), \ 69 NN_TLOG_("\n"), \ 70 ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 71 0) ) 72 #define NN_SASSERTMSG_(exp, ...) \ 73 (void) ((exp) || ( NN_SLOG_("Failed assertion at %s:%d\n ", NN_FILE_NAME, __LINE__), \ 74 NN_SLOG_(__VA_ARGS__), \ 75 NN_SLOG_("\n"), \ 76 ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 77 0) ) 78 #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) \ 79 (void) ((exp) || ( NN_TLOG_("Result Assertion cannot be used on Kernel at %s:%d\n ", NN_FILE_NAME, __LINE__), \ 80 NN_TLOG_(__VA_ARGS__), \ 81 NN_TLOG_("\n"), \ 82 ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 83 0) ) 84 #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) \ 85 (void) ((exp) || ( NN_SLOG_("Result Assertion cannot be used on Kernel at %s:%d\n ", NN_FILE_NAME, __LINE__), \ 86 NN_SLOG_(__VA_ARGS__), \ 87 NN_SLOG_("\n"), \ 88 ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 89 0) ) 90 #else 91 #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK 92 #define NN_TASSERTMSG_(exp, ...) \ 93 (void) ((exp) || nndbgTAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__)) 94 #define NN_SASSERTMSG_(exp, ...) \ 95 (void) ((exp) || nndbgAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__)) 96 #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) \ 97 (void) ((exp) || nnResultTFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__)) 98 #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) \ 99 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__)) 100 #else 101 #define NN_TASSERTMSG_(exp, ...) \ 102 (void) ((exp) || nndbgTAssertionFailureHandler(false, NULL, __LINE__, NULL)) 103 #define NN_SASSERTMSG_(exp, ...) \ 104 (void) ((exp) || nndbgAssertionFailureHandler(false, NULL, __LINE__, NULL)) 105 #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) \ 106 (void) ((exp) || nnResultTFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL)) 107 #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) \ 108 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL)) 109 #endif 110 #endif 111 #else 112 #define NN_TASSERTMSG_(exp, ...) ((void)0) 113 #define NN_SASSERTMSG_(exp, ...) ((void)0) 114 #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) ((void)0) 115 #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) ((void)0) 116 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK 117 118 119 #define NN_ANY_TO_UPTR(ptr) ((uptr)((const void*)(ptr))) 120 #define NN_IS_VALID_POINTER(ptr) ( (NN_OS_ADDR_NULL_TRAP_END <= NN_ANY_TO_UPTR(ptr)) \ 121 && (NN_ANY_TO_UPTR(ptr) < NN_OS_ADDR_SPACE_END) ) 122 123 124 #define NN_ASSERT(exp) NN_ASSERTMSG((exp), "%s", #exp) 125 #define NN_TASSERT_(exp) NN_TASSERTMSG_((exp), "%s", #exp) 126 #define NN_SASSERT_(exp) NN_SASSERTMSG_((exp), "%s", #exp) 127 128 #define NN_ASSERT_RESULT(exp) NN_ASSERTMSG_WITH_RESULT((exp).IsSuccess(), (exp), "") 129 #define NN_TASSERT_RESULT_(exp) NN_TASSERTMSG_WITH_RESULT_((exp).IsSuccess(), (exp), "") 130 #define NN_SASSERT_RESULT_(exp) NN_SASSERTMSG_WITH_RESULT_((exp).IsSuccess(), (exp), "") 131 132 #define NN_NULL_ASSERT(exp) NN_ASSERTMSG( (exp) != NULL, "%s must not be NULL", #exp ) 133 #define NN_NULL_TASSERT_(exp) NN_TASSERTMSG_( (exp) != NULL, "%s must not be NULL", #exp ) 134 #define NN_NULL_SASSERT_(exp) NN_SASSERTMSG_( (exp) != NULL, "%s must not be NULL", #exp ) 135 136 #define NN_ALIGN_ASSERT(exp, align) NN_ASSERTMSG( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align ) 137 #define NN_ALIGN_TASSERT_(exp, align) NN_TASSERTMSG_( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align ) 138 #define NN_ALIGN_SASSERT_(exp, align) NN_SASSERTMSG_( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align ) 139 140 #define NN_MIN_ASSERT(exp, min) NN_ASSERTMSG( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min ) 141 #define NN_MIN_TASSERT_(exp, min) NN_TASSERTMSG_( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min ) 142 #define NN_MIN_SASSERT_(exp, min) NN_SASSERTMSG_( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min ) 143 144 #define NN_MAX_ASSERT(exp, max) NN_ASSERTMSG( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max ) 145 #define NN_MAX_TASSERT_(exp, max) NN_TASSERTMSG_( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max ) 146 #define NN_MAX_SASSERT_(exp, max) NN_SASSERTMSG_( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max ) 147 148 #define NN_MINMAX_ASSERT(exp, min, max) NN_ASSERTMSG( (exp) >= (min) && (exp) <= (max), "%s(=%d) must be >= %s(=%d) and <= %s(=%d).", #exp, (exp), #min, min, #max, max ) 149 #define NN_MINMAX_TASSERT_(exp, min, max) NN_TASSERTMSG_( (exp) >= (min) && (exp) <= (max), "%s(=%d) must be >= %s(=%d) and <= %s(=%d).", #exp, (exp), #min, min, #max, max ) 150 #define NN_MINMAX_SASSERT_(exp, min, max) NN_SASSERTMSG_( (exp) >= (min) && (exp) <= (max), "%s(=%d) must be >= %s(=%d) and <= %s(=%d).", #exp, (exp), #min, min, #max, max ) 151 152 #define NN_EQUAL_ASSERT(exp, equ) NN_ASSERTMSG( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ ) 153 #define NN_EQUAL_TASSERT_(exp, equ) NN_TASSERTMSG_( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ ) 154 #define NN_EQUAL_SASSERT_(exp, equ) NN_SASSERTMSG_( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ ) 155 156 #define NN_NOT_EQUAL_ASSERT(exp, equ) NN_ASSERTMSG( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ ) 157 #define NN_NOT_EQUAL_TASSERT_(exp, equ) NN_TASSERTMSG_( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ ) 158 #define NN_NOT_EQUAL_SASSERT_(exp, equ) NN_SASSERTMSG_( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ ) 159 160 #define NN_POINTER_ASSERT(p) NN_ASSERTMSG(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p)) 161 #define NN_POINTER_TASSERT_(p) NN_TASSERTMSG_(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p)) 162 #define NN_POINTER_SASSERT_(p) NN_SASSERTMSG_(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p)) 163 164 #define NN_THIS_ASSERT() NN_POINTER_ASSERT(this) 165 #define NN_THIS_TASSERT_() NN_POINTER_TASSERT_(this) 166 #define NN_THIS_SASSERT_() NN_POINTER_SASSERT_(this) 167 168 #define NN_ASSERT_WITH_RESULT(exp, result) NN_ASSERTMSG_WITH_RESULT( (exp), (result), "%s", #exp ) 169 #define NN_TASSERT_WITH_RESULT_(exp, result) NN_TASSERTMSG_WITH_RESULT_( (exp), (result), "%s", #exp ) 170 #define NN_SASSERT_WITH_RESULT_(exp, result) NN_SASSERTMSG_WITH_RESULT_( (exp), (result), "%s", #exp ) 171 172 #define NN_FLOAT_ASSERT(exp) \ 173 NN_ASSERTMSG((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.") 174 #define NN_FLOAT_TASSERT_(exp) \ 175 NN_TASSERTMSG_((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.") 176 #define NN_FLOAT_SASSERT_(exp) \ 177 NN_SASSERTMSG_((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.") 178 179 180 // Panic 181 182 #ifdef __cplusplus 183 #define NN_PANIC(...) \ 184 (void) (NN_LOG("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ 185 NN_LOG(__VA_ARGS__), \ 186 NN_LOG("\n"), \ 187 ::nn::dbg::Panic()) 188 #define NN_TPANIC_(...) \ 189 (void) (NN_TLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ 190 NN_TLOG_(__VA_ARGS__), \ 191 NN_TLOG_("\n"), \ 192 ::nn::dbg::Panic()) 193 #define NN_SPANIC_(...) \ 194 (void) (NN_SLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ 195 NN_SLOG_(__VA_ARGS__), \ 196 NN_SLOG_("\n"), \ 197 ::nn::dbg::Panic()) 198 #else 199 #define NN_PANIC(...) \ 200 (void) (NN_LOG("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ 201 NN_LOG(__VA_ARGS__), \ 202 NN_LOG("\n"), \ 203 nndbgPanic()) 204 #define NN_TPANIC_(...) \ 205 (void) (NN_TLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ 206 NN_TLOG_(__VA_ARGS__), \ 207 NN_TLOG_("\n"), \ 208 nndbgPanic()) 209 #define NN_SPANIC_(...) \ 210 (void) (NN_SLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ 211 NN_SLOG_(__VA_ARGS__), \ 212 NN_SLOG_("\n"), \ 213 nndbgPanic()) 214 #endif 215 216 #define NN_PANIC_WITH_RESULT(result, ...) \ 217 ((void)nnResultPanicHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__), NN_PANIC(__VA_ARGS__)) 218 219 #define NN_TPANIC_WITH_RESULT_(result, ...) \ 220 ((void)nnResultTPanicHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__), NN_TPANIC_(__VA_ARGS__)) 221 222 #define NN_PANIC_IF_FALSE(result) \ 223 do \ 224 { \ 225 if (!(result)) \ 226 { \ 227 NN_PANIC("Failed condition."); \ 228 } \ 229 } while(0) \ 230 231 #define NN_TPANIC_IF_FALSE_(result) \ 232 do \ 233 { \ 234 if (!(result)) \ 235 { \ 236 NN_TPANIC_("Failed condition."); \ 237 } \ 238 } while(0) \ 239 240 #define NN_PANIC_IF_NULL(result) NN_PANIC_IF_FALSE(result) 241 #define NN_TPANIC_IF_NULL_(result) NN_TPANIC_IF_FALSE_(result) 242 243 244 // Warning 245 246 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING 247 #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT 248 #define NN_WARNING(exp, ...) (void) ((exp) || (nndbgDetailPrintf(__VA_ARGS__), 0)) 249 #else 250 #define NN_WARNING(exp, ...) ((void)0) 251 #endif 252 #else 253 #define NN_WARNING(exp, ...) ((void)0) 254 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING 255 256 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK 257 #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK 258 #define NN_TWARNING_(exp, ...) (void) ((exp) || (nndbgDetailTPrintf(__VA_ARGS__), 0)) 259 #define NN_SWARNING_(exp, ...) (void) ((exp) || (nndbgDetailPrintf(__VA_ARGS__), 0)) 260 #else 261 #define NN_TWARNING_(exp, ...) ((void)0) 262 #define NN_SWARNING_(exp, ...) ((void)0) 263 #endif 264 #else 265 #define NN_TWARNING_(exp, ...) ((void)0) 266 #define NN_SWARNING_(exp, ...) ((void)0) 267 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK 268 269 #endif /* NN_ASSERT_H_ */ 270