X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/497a2d6d54e8848045a6ee49439d20d3677a9835..9dc1d18069c519c807c2476a837e710b5ef932c6:/include/wx/debug.h diff --git a/include/wx/debug.h b/include/wx/debug.h index e1d1f8a821..06f302d820 100644 --- a/include/wx/debug.h +++ b/include/wx/debug.h @@ -47,6 +47,24 @@ #endif /* !WXDEBUG */ #endif /* __WXDEBUG__ */ +#ifndef __WXFUNCTION__ + /* TODO: add more compilers supporting __FUNCTION__ */ + #if defined(__DMC__) + /* + __FUNCTION__ happens to be not defined within class members + http://www.digitalmars.com/drn-bin/wwwnews?c%2B%2B.beta/485 + */ + #define __WXFUNCTION__ (NULL) + #elif defined(__GNUC__) || \ + (defined(_MSC_VER) && _MSC_VER >= 1300) || \ + defined(__FUNCTION__) + #define __WXFUNCTION__ __FUNCTION__ + #else + /* still define __WXFUNCTION__ to avoid #ifdefs elsewhere */ + #define __WXFUNCTION__ (NULL) + #endif +#endif /* __WXFUNCTION__ already defined */ + /* ---------------------------------------------------------------------------- */ /* Debugging macros */ /* */ @@ -78,11 +96,13 @@ Parameters: szFile and nLine - file name and line number of the ASSERT + szFunc - function name of the ASSERT, may be NULL (NB: ASCII) szCond - text form of the condition which failed szMsg - optional message explaining the reason */ extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *szFile, int nLine, + const char *szFunc, const wxChar *szCond, const wxChar *szMsg = NULL); @@ -94,14 +114,21 @@ #define wxASSERT(cond) wxASSERT_MSG(cond, NULL) /* assert with additional message explaining it's cause */ - #define wxASSERT_MSG(cond, msg) \ - if (cond) ; else wxOnAssert(__TFILE__, __LINE__, _T(#cond), msg) + #define wxASSERT_MSG(cond, msg) \ + if ( cond ) \ + ; \ + else \ + wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg) /* special form of assert: always triggers it (in debug mode) */ #define wxFAIL wxFAIL_MSG(NULL) /* FAIL with some message */ - #define wxFAIL_MSG(msg) wxOnAssert(__TFILE__, __LINE__, wxT("wxAssertFailure"), msg) + #define wxFAIL_MSG(msg) wxFAIL_COND_MSG("wxAssertFailure", msg) + + /* FAIL with some message and a condition */ + #define wxFAIL_COND_MSG(cond, msg) \ + wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(cond), msg) /* an assert helper used to avoid warning when testing constant expressions, */ /* i.e. wxASSERT( sizeof(int) == 4 ) can generate a compiler warning about */ @@ -117,9 +144,10 @@ /* nothing to do in release modes (hopefully at this moment there are */ /* no more bugs ;-) */ #define wxASSERT(cond) - #define wxASSERT_MSG(x, m) + #define wxASSERT_MSG(cond, msg) #define wxFAIL #define wxFAIL_MSG(msg) + #define wxFAIL_COND_MSG(cond, msg) #endif /* __WXDEBUG__ */ #ifdef __cplusplus @@ -140,16 +168,24 @@ */ /* check that expression is true, "return" if not (also FAILs in debug mode) */ -#define wxCHECK(x, rc) wxCHECK_MSG(x, rc, NULL) +#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, NULL) /* as wxCHECK but with a message explaining why we fail */ -#define wxCHECK_MSG(x, rc, msg) wxCHECK2_MSG(x, return rc, msg) +#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg) /* check that expression is true, perform op if not */ -#define wxCHECK2(x, op) wxCHECK2_MSG(x, op, NULL) +#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, NULL) /* as wxCHECK2 but with a message explaining why we fail */ -#define wxCHECK2_MSG(x, op, msg) if (x) ; else do { wxFAIL_MSG(msg); op; } while (0) +#define wxCHECK2_MSG(cond, op, msg) \ + if ( cond ) \ + ; \ + else \ + { \ + wxFAIL_COND_MSG(#cond, msg); \ + op; \ + } \ + struct wxDummyCheckStruct /* just to force a semicolon */ /* special form of wxCHECK2: as wxCHECK, but for use in void functions */ /* */ @@ -157,7 +193,7 @@ /* there is no other way to tell the caller what exactly went wrong */ /* from the void function (of course, the function shouldn't be void */ /* to begin with...) */ -#define wxCHECK_RET(x, msg) wxCHECK2_MSG(x, return, msg) +#define wxCHECK_RET(cond, msg) wxCHECK2_MSG(cond, return, msg) /* ---------------------------------------------------------------------------- */ /* Compile time asserts */