/*---------------------------------------------------------------------------* Project: Horizon File: assert.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 29161 $ *---------------------------------------------------------------------------*/ #ifndef NN_ASSERT_H_ #define NN_ASSERT_H_ #include #include #include #include #include //TORIAEZU #include #include // Assert #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING #ifdef NN_SYSTEM_KERNEL #define NN_ASSERTMSG(exp, ...) \ (void) ((exp) || ( NN_LOG("Failed assertion at %s:%d\n ", NN_FILE_NAME, __LINE__), \ NN_LOG(__VA_ARGS__), \ NN_LOG("\n"), \ ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 0) ) #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) \ (void) ((exp) || ( NN_LOG("Result Assertion cannot be used on Kernel at %s:%d\n ", NN_FILE_NAME, __LINE__), \ NN_LOG(__VA_ARGS__), \ NN_LOG("\n"), \ ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 0) ) #else #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT #define NN_ASSERTMSG(exp, ...) \ (void) ((exp) || nndbgAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__)) #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) \ (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__)) #else #define NN_ASSERTMSG(exp, ...) \ (void) ((exp) || nndbgAssertionFailureHandler(false, NULL, __LINE__, NULL)) #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) \ (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL)) #endif #endif #else #define NN_ASSERTMSG(exp, ...) ((void)0) #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) ((void)0) #endif // NN_SWITCH_DISABLE_ASSERT_WARNING #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK #ifdef NN_SYSTEM_KERNEL #define NN_TASSERTMSG_(exp, ...) \ (void) ((exp) || ( NN_TLOG_("Failed assertion at %s:%d\n ", NN_FILE_NAME, __LINE__), \ NN_TLOG_(__VA_ARGS__), \ NN_TLOG_("\n"), \ ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 0) ) #define NN_SASSERTMSG_(exp, ...) \ (void) ((exp) || ( NN_SLOG_("Failed assertion at %s:%d\n ", NN_FILE_NAME, __LINE__), \ NN_SLOG_(__VA_ARGS__), \ NN_SLOG_("\n"), \ ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 0) ) #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) \ (void) ((exp) || ( NN_TLOG_("Result Assertion cannot be used on Kernel at %s:%d\n ", NN_FILE_NAME, __LINE__), \ NN_TLOG_(__VA_ARGS__), \ NN_TLOG_("\n"), \ ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 0) ) #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) \ (void) ((exp) || ( NN_SLOG_("Result Assertion cannot be used on Kernel at %s:%d\n ", NN_FILE_NAME, __LINE__), \ NN_SLOG_(__VA_ARGS__), \ NN_SLOG_("\n"), \ ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT), \ 0) ) #else #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK #define NN_TASSERTMSG_(exp, ...) \ (void) ((exp) || nndbgTAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__)) #define NN_SASSERTMSG_(exp, ...) \ (void) ((exp) || nndbgAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__)) #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) \ (void) ((exp) || nnResultTFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__)) #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) \ (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__)) #else #define NN_TASSERTMSG_(exp, ...) \ (void) ((exp) || nndbgTAssertionFailureHandler(false, NULL, __LINE__, NULL)) #define NN_SASSERTMSG_(exp, ...) \ (void) ((exp) || nndbgAssertionFailureHandler(false, NULL, __LINE__, NULL)) #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) \ (void) ((exp) || nnResultTFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL)) #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) \ (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL)) #endif #endif #else #define NN_TASSERTMSG_(exp, ...) ((void)0) #define NN_SASSERTMSG_(exp, ...) ((void)0) #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) ((void)0) #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) ((void)0) #endif // NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK #define NN_ANY_TO_UPTR(ptr) ((uptr)((const void*)(ptr))) #define NN_IS_VALID_POINTER(ptr) ( (NN_OS_ADDR_NULL_TRAP_END <= NN_ANY_TO_UPTR(ptr)) \ && (NN_ANY_TO_UPTR(ptr) < NN_OS_ADDR_SPACE_END) ) #define NN_ASSERT(exp) NN_ASSERTMSG((exp), "%s", #exp) #define NN_TASSERT_(exp) NN_TASSERTMSG_((exp), "%s", #exp) #define NN_SASSERT_(exp) NN_SASSERTMSG_((exp), "%s", #exp) #define NN_ASSERT_RESULT(exp) NN_ASSERTMSG_WITH_RESULT((exp).IsSuccess(), (exp), "") #define NN_TASSERT_RESULT_(exp) NN_TASSERTMSG_WITH_RESULT_((exp).IsSuccess(), (exp), "") #define NN_SASSERT_RESULT_(exp) NN_SASSERTMSG_WITH_RESULT_((exp).IsSuccess(), (exp), "") #define NN_NULL_ASSERT(exp) NN_ASSERTMSG( (exp) != NULL, "%s must not be NULL", #exp ) #define NN_NULL_TASSERT_(exp) NN_TASSERTMSG_( (exp) != NULL, "%s must not be NULL", #exp ) #define NN_NULL_SASSERT_(exp) NN_SASSERTMSG_( (exp) != NULL, "%s must not be NULL", #exp ) #define NN_ALIGN_ASSERT(exp, align) NN_ASSERTMSG( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align ) #define NN_ALIGN_TASSERT_(exp, align) NN_TASSERTMSG_( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align ) #define NN_ALIGN_SASSERT_(exp, align) NN_SASSERTMSG_( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align ) #define NN_MIN_ASSERT(exp, min) NN_ASSERTMSG( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min ) #define NN_MIN_TASSERT_(exp, min) NN_TASSERTMSG_( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min ) #define NN_MIN_SASSERT_(exp, min) NN_SASSERTMSG_( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min ) #define NN_MAX_ASSERT(exp, max) NN_ASSERTMSG( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max ) #define NN_MAX_TASSERT_(exp, max) NN_TASSERTMSG_( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max ) #define NN_MAX_SASSERT_(exp, max) NN_SASSERTMSG_( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max ) #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 ) #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 ) #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 ) #define NN_EQUAL_ASSERT(exp, equ) NN_ASSERTMSG( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ ) #define NN_EQUAL_TASSERT_(exp, equ) NN_TASSERTMSG_( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ ) #define NN_EQUAL_SASSERT_(exp, equ) NN_SASSERTMSG_( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ ) #define NN_NOT_EQUAL_ASSERT(exp, equ) NN_ASSERTMSG( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ ) #define NN_NOT_EQUAL_TASSERT_(exp, equ) NN_TASSERTMSG_( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ ) #define NN_NOT_EQUAL_SASSERT_(exp, equ) NN_SASSERTMSG_( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ ) #define NN_POINTER_ASSERT(p) NN_ASSERTMSG(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p)) #define NN_POINTER_TASSERT_(p) NN_TASSERTMSG_(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p)) #define NN_POINTER_SASSERT_(p) NN_SASSERTMSG_(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p)) #define NN_THIS_ASSERT() NN_POINTER_ASSERT(this) #define NN_THIS_TASSERT_() NN_POINTER_TASSERT_(this) #define NN_THIS_SASSERT_() NN_POINTER_SASSERT_(this) #define NN_ASSERT_WITH_RESULT(exp, result) NN_ASSERTMSG_WITH_RESULT( (exp), (result), "%s", #exp ) #define NN_TASSERT_WITH_RESULT_(exp, result) NN_TASSERTMSG_WITH_RESULT_( (exp), (result), "%s", #exp ) #define NN_SASSERT_WITH_RESULT_(exp, result) NN_SASSERTMSG_WITH_RESULT_( (exp), (result), "%s", #exp ) #define NN_FLOAT_ASSERT(exp) \ NN_ASSERTMSG((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.") #define NN_FLOAT_TASSERT_(exp) \ NN_TASSERTMSG_((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.") #define NN_FLOAT_SASSERT_(exp) \ NN_SASSERTMSG_((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.") #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING #define NN_RESULT_ASSERT(exp) NN_UTIL_PANIC_IF_FAILED(exp) #else #define NN_RESULT_ASSERT(exp) ((void)0) #endif // Panic #ifdef __cplusplus #define NN_PANIC(...) \ (void) (NN_LOG("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ NN_LOG(__VA_ARGS__), \ NN_LOG("\n"), \ ::nn::dbg::Panic()) #define NN_TPANIC_(...) \ (void) (NN_TLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ NN_TLOG_(__VA_ARGS__), \ NN_TLOG_("\n"), \ ::nn::dbg::Panic()) #define NN_SPANIC_(...) \ (void) (NN_SLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ NN_SLOG_(__VA_ARGS__), \ NN_SLOG_("\n"), \ ::nn::dbg::Panic()) #else #define NN_PANIC(...) \ (void) (NN_LOG("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ NN_LOG(__VA_ARGS__), \ NN_LOG("\n"), \ nndbgPanic()) #define NN_TPANIC_(...) \ (void) (NN_TLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ NN_TLOG_(__VA_ARGS__), \ NN_TLOG_("\n"), \ nndbgPanic()) #define NN_SPANIC_(...) \ (void) (NN_SLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__), \ NN_SLOG_(__VA_ARGS__), \ NN_SLOG_("\n"), \ nndbgPanic()) #endif #define NN_PANIC_WITH_RESULT(result, ...) \ ((void)nnResultPanicHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__), NN_PANIC(__VA_ARGS__)) #define NN_TPANIC_WITH_RESULT_(result, ...) \ ((void)nnResultTPanicHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__), NN_TPANIC_(__VA_ARGS__)) #define NN_PANIC_IF_FALSE(result) \ do \ { \ if (!(result)) \ { \ NN_PANIC("Failed condition."); \ } \ } while(0) \ #define NN_TPANIC_IF_FALSE_(result) \ do \ { \ if (!(result)) \ { \ NN_TPANIC_("Failed condition."); \ } \ } while(0) \ #define NN_PANIC_IF_NULL(result) NN_PANIC_IF_FALSE(result) #define NN_TPANIC_IF_NULL_(result) NN_TPANIC_IF_FALSE_(result) // Warning #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT #define NN_WARNING(exp, ...) (void) ((exp) || (nndbgDetailPrintf(__VA_ARGS__), 0)) #else #define NN_WARNING(exp, ...) ((void)0) #endif #else #define NN_WARNING(exp, ...) ((void)0) #endif // NN_SWITCH_DISABLE_ASSERT_WARNING #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK #define NN_TWARNING_(exp, ...) (void) ((exp) || (nndbgDetailTPrintf(__VA_ARGS__), 0)) #define NN_SWARNING_(exp, ...) (void) ((exp) || (nndbgDetailPrintf(__VA_ARGS__), 0)) #else #define NN_TWARNING_(exp, ...) ((void)0) #define NN_SWARNING_(exp, ...) ((void)0) #endif #else #define NN_TWARNING_(exp, ...) ((void)0) #define NN_SWARNING_(exp, ...) ((void)0) #endif // NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK #endif /* NN_ASSERT_H_ */