From 0accd1cfe8f53656e5f11a8900c716c56b412dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 21 May 2007 18:02:57 +0000 Subject: [PATCH] 1. make debugging macros compatible with ANSI build even in Unicode build (i.e., no need to use _T() in message strings) 2. save space in binary by using ANSI literals for filenames and expression strings in debug macros git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46145 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/debug.h | 52 +++++++++++++++++++---- include/wx/log.h | 4 +- src/common/appbase.cpp | 93 +++++++++++++++++++++++++++++++++--------- 3 files changed, 120 insertions(+), 29 deletions(-) diff --git a/include/wx/debug.h b/include/wx/debug.h index f7815a9844..146e6d1ab0 100644 --- a/include/wx/debug.h +++ b/include/wx/debug.h @@ -100,18 +100,56 @@ szCond - text form of the condition which failed szMsg - optional message explaining the reason */ + + /* this version is for compatibility with wx 2.8: */ extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *szFile, int nLine, const char *szFunc, const wxChar *szCond, const wxChar *szMsg = NULL); +#if wxUSE_UNICODE + /* char versions are used by debugging macros; we have to provide + wxChar* szMsg version because it's common to use _T() in the macros + and finally, we can't use const wx(char)* szMsg = NULL, because that + would be ambiguous: */ + extern void WXDLLIMPEXP_BASE wxOnAssert(const char *szFile, + int nLine, + const char *szFunc, + const char *szCond); + + extern void WXDLLIMPEXP_BASE wxOnAssert(const char *szFile, + int nLine, + const char *szFunc, + const char *szCond, + const char *szMsg); + + extern void WXDLLIMPEXP_BASE wxOnAssert(const char *szFile, + int nLine, + const char *szFunc, + const char *szCond, + const wxChar *szMsg); +#endif // wxUSE_UNICODE + + class WXDLLIMPEXP_BASE wxString; + /* these two work when szMsg passed to debug macro is a string: */ + extern void WXDLLIMPEXP_BASE wxOnAssert(const wxString& szFile, + int nLine, + const wxString& szFunc, + const wxString& szCond, + const wxString& szMsg); + + extern void WXDLLIMPEXP_BASE wxOnAssert(const wxString& szFile, + int nLine, + const wxString& szFunc, + const wxString& szCond); + /* call this function to break into the debugger unconditionally (assuming */ /* the program is running under debugger, of course) */ extern void WXDLLIMPEXP_BASE wxTrap(); /* generic assert macro */ - #define wxASSERT(cond) wxASSERT_MSG(cond, NULL) + #define wxASSERT(cond) wxASSERT_MSG(cond, (const char*)NULL) /* assert with additional message explaining its cause */ @@ -123,24 +161,24 @@ if ( cond ) \ {} \ else \ - wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg) + wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, #cond, msg) #else #define wxASSERT_MSG(cond, msg) \ if ( cond ) \ ; \ else \ - wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg) + wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, #cond, msg) #endif /* special form of assert: always triggers it (in debug mode) */ - #define wxFAIL wxFAIL_MSG(NULL) + #define wxFAIL wxFAIL_MSG((const char*)NULL) /* FAIL with some message */ #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) + wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, 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 */ @@ -180,13 +218,13 @@ */ /* check that expression is true, "return" if not (also FAILs in debug mode) */ -#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, NULL) +#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, (const char*)NULL) /* as wxCHECK but with a message explaining why we fail */ #define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg) /* check that expression is true, perform op if not */ -#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, NULL) +#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, (const char*)NULL) /* as wxCHECK2 but with a message explaining why we fail */ diff --git a/include/wx/log.h b/include/wx/log.h index c547984bb9..8eb4cf7f3b 100644 --- a/include/wx/log.h +++ b/include/wx/log.h @@ -714,13 +714,13 @@ wxSafeShowMessage(const wxString& title, const wxString& text); #ifdef __VISUALC__ #define wxLogApiError(api, rc) \ wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \ - __TFILE__, __LINE__, api, \ + __FILE__, __LINE__, api, \ (long)rc, wxSysErrorMsg(rc)) #else // !VC++ #define wxLogApiError(api, rc) \ wxLogDebug(wxT("In file %s at line %d: '%s' failed with ") \ wxT("error 0x%08lx (%s)."), \ - __TFILE__, __LINE__, api, \ + __FILE__, __LINE__, api, \ (long)rc, wxSysErrorMsg(rc)) #endif // VC++/!VC++ diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index 63b5ceb46b..477935187f 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -95,11 +95,11 @@ // prepare for showing the assert dialog, use the given traits or // DoShowAssertDialog() as last fallback to really show it static - void ShowAssertDialog(const wxChar *szFile, + void ShowAssertDialog(const wxString& szFile, int nLine, - const wxChar *szFunc, - const wxChar *szCond, - const wxChar *szMsg, + const wxString& szFunc, + const wxString& szCond, + const wxString& szMsg, wxAppTraits *traits = NULL); // turn on the trace masks specified in the env variable WXTRACE @@ -780,11 +780,11 @@ void wxTrap() } // this function is called when an assert fails -void wxOnAssert(const wxChar *szFile, - int nLine, - const char *szFunc, - const wxChar *szCond, - const wxChar *szMsg) +static void wxDoOnAssert(const wxString& szFile, + int nLine, + const wxString& szFunc, + const wxString& szCond, + const wxString& szMsg = wxEmptyString) { // FIXME MT-unsafe static bool s_bInAssert = false; @@ -801,24 +801,77 @@ void wxOnAssert(const wxChar *szFile, s_bInAssert = true; - // __FUNCTION__ is always in ASCII, convert it to wide char if needed - const wxString strFunc = wxString::FromAscii(szFunc); - if ( !wxTheApp ) { // by default, show the assert dialog box -- we can't customize this // behaviour - ShowAssertDialog(szFile, nLine, strFunc, szCond, szMsg); + ShowAssertDialog(szFile, nLine, szFunc, szCond, szMsg); } else { // let the app process it as it wants - wxTheApp->OnAssertFailure(szFile, nLine, strFunc, szCond, szMsg); + // FIXME-UTF8: use wc_str(), not c_str(), when ANSI build is removed + wxTheApp->OnAssertFailure(szFile.c_str(), nLine, szFunc.c_str(), + szCond.c_str(), szMsg.c_str()); } s_bInAssert = false; } +void wxOnAssert(const wxString& szFile, + int nLine, + const wxString& szFunc, + const wxString& szCond, + const wxString& szMsg) +{ + wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg); +} + +void wxOnAssert(const wxString& szFile, + int nLine, + const wxString& szFunc, + const wxString& szCond) +{ + wxDoOnAssert(szFile, nLine, szFunc, szCond); +} + +void wxOnAssert(const wxChar *szFile, + int nLine, + const char *szFunc, + const wxChar *szCond, + const wxChar *szMsg) +{ + wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg); +} + +#if wxUSE_UNICODE +void wxOnAssert(const char *szFile, + int nLine, + const char *szFunc, + const char *szCond) +{ + wxDoOnAssert(szFile, nLine, szFunc, szCond); +} + +void wxOnAssert(const char *szFile, + int nLine, + const char *szFunc, + const char *szCond, + const char *szMsg) +{ + wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg); +} + +void wxOnAssert(const char *szFile, + int nLine, + const char *szFunc, + const char *szCond, + const wxChar *szMsg) +{ + wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg); +} +#endif // wxUSE_UNICODE + #endif // __WXDEBUG__ // ============================================================================ @@ -879,11 +932,11 @@ bool DoShowAssertDialog(const wxString& msg) // show the assert modal dialog static -void ShowAssertDialog(const wxChar *szFile, +void ShowAssertDialog(const wxString& szFile, int nLine, - const wxChar *szFunc, - const wxChar *szCond, - const wxChar *szMsg, + const wxString& szFunc, + const wxString& szCond, + const wxString& szMsg, wxAppTraits *traits) { // this variable can be set to true to suppress "assert failure" messages @@ -898,11 +951,11 @@ void ShowAssertDialog(const wxChar *szFile, msg.Printf(wxT("%s(%d): assert \"%s\" failed"), szFile, nLine, szCond); // add the function name, if any - if ( szFunc && *szFunc ) + if ( !szFunc.empty() ) msg << _T(" in ") << szFunc << _T("()"); // and the message itself - if ( szMsg ) + if ( !szMsg.empty() ) { msg << _T(": ") << szMsg; }