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
This commit is contained in:
@@ -100,18 +100,56 @@
|
|||||||
szCond - text form of the condition which failed
|
szCond - text form of the condition which failed
|
||||||
szMsg - optional message explaining the reason
|
szMsg - optional message explaining the reason
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* this version is for compatibility with wx 2.8: */
|
||||||
extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *szFile,
|
extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *szFile,
|
||||||
int nLine,
|
int nLine,
|
||||||
const char *szFunc,
|
const char *szFunc,
|
||||||
const wxChar *szCond,
|
const wxChar *szCond,
|
||||||
const wxChar *szMsg = NULL);
|
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 */
|
/* call this function to break into the debugger unconditionally (assuming */
|
||||||
/* the program is running under debugger, of course) */
|
/* the program is running under debugger, of course) */
|
||||||
extern void WXDLLIMPEXP_BASE wxTrap();
|
extern void WXDLLIMPEXP_BASE wxTrap();
|
||||||
|
|
||||||
/* generic assert macro */
|
/* 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 */
|
/* assert with additional message explaining its cause */
|
||||||
@@ -123,24 +161,24 @@
|
|||||||
if ( cond ) \
|
if ( cond ) \
|
||||||
{} \
|
{} \
|
||||||
else \
|
else \
|
||||||
wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg)
|
wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, #cond, msg)
|
||||||
#else
|
#else
|
||||||
#define wxASSERT_MSG(cond, msg) \
|
#define wxASSERT_MSG(cond, msg) \
|
||||||
if ( cond ) \
|
if ( cond ) \
|
||||||
; \
|
; \
|
||||||
else \
|
else \
|
||||||
wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg)
|
wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, #cond, msg)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* special form of assert: always triggers it (in debug mode) */
|
/* 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 */
|
/* FAIL with some message */
|
||||||
#define wxFAIL_MSG(msg) wxFAIL_COND_MSG("wxAssertFailure", msg)
|
#define wxFAIL_MSG(msg) wxFAIL_COND_MSG("wxAssertFailure", msg)
|
||||||
|
|
||||||
/* FAIL with some message and a condition */
|
/* FAIL with some message and a condition */
|
||||||
#define wxFAIL_COND_MSG(cond, msg) \
|
#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, */
|
/* An assert helper used to avoid warning when testing constant expressions, */
|
||||||
/* i.e. wxASSERT( sizeof(int) == 4 ) can generate a compiler warning about */
|
/* 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) */
|
/* 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 */
|
/* as wxCHECK but with a message explaining why we fail */
|
||||||
#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg)
|
#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg)
|
||||||
|
|
||||||
/* check that expression is true, perform op if not */
|
/* 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 */
|
/* as wxCHECK2 but with a message explaining why we fail */
|
||||||
|
|
||||||
|
@@ -714,13 +714,13 @@ wxSafeShowMessage(const wxString& title, const wxString& text);
|
|||||||
#ifdef __VISUALC__
|
#ifdef __VISUALC__
|
||||||
#define wxLogApiError(api, rc) \
|
#define wxLogApiError(api, rc) \
|
||||||
wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \
|
wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \
|
||||||
__TFILE__, __LINE__, api, \
|
__FILE__, __LINE__, api, \
|
||||||
(long)rc, wxSysErrorMsg(rc))
|
(long)rc, wxSysErrorMsg(rc))
|
||||||
#else // !VC++
|
#else // !VC++
|
||||||
#define wxLogApiError(api, rc) \
|
#define wxLogApiError(api, rc) \
|
||||||
wxLogDebug(wxT("In file %s at line %d: '%s' failed with ") \
|
wxLogDebug(wxT("In file %s at line %d: '%s' failed with ") \
|
||||||
wxT("error 0x%08lx (%s)."), \
|
wxT("error 0x%08lx (%s)."), \
|
||||||
__TFILE__, __LINE__, api, \
|
__FILE__, __LINE__, api, \
|
||||||
(long)rc, wxSysErrorMsg(rc))
|
(long)rc, wxSysErrorMsg(rc))
|
||||||
#endif // VC++/!VC++
|
#endif // VC++/!VC++
|
||||||
|
|
||||||
|
@@ -95,11 +95,11 @@
|
|||||||
// prepare for showing the assert dialog, use the given traits or
|
// prepare for showing the assert dialog, use the given traits or
|
||||||
// DoShowAssertDialog() as last fallback to really show it
|
// DoShowAssertDialog() as last fallback to really show it
|
||||||
static
|
static
|
||||||
void ShowAssertDialog(const wxChar *szFile,
|
void ShowAssertDialog(const wxString& szFile,
|
||||||
int nLine,
|
int nLine,
|
||||||
const wxChar *szFunc,
|
const wxString& szFunc,
|
||||||
const wxChar *szCond,
|
const wxString& szCond,
|
||||||
const wxChar *szMsg,
|
const wxString& szMsg,
|
||||||
wxAppTraits *traits = NULL);
|
wxAppTraits *traits = NULL);
|
||||||
|
|
||||||
// turn on the trace masks specified in the env variable WXTRACE
|
// 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
|
// this function is called when an assert fails
|
||||||
void wxOnAssert(const wxChar *szFile,
|
static void wxDoOnAssert(const wxString& szFile,
|
||||||
int nLine,
|
int nLine,
|
||||||
const char *szFunc,
|
const wxString& szFunc,
|
||||||
const wxChar *szCond,
|
const wxString& szCond,
|
||||||
const wxChar *szMsg)
|
const wxString& szMsg = wxEmptyString)
|
||||||
{
|
{
|
||||||
// FIXME MT-unsafe
|
// FIXME MT-unsafe
|
||||||
static bool s_bInAssert = false;
|
static bool s_bInAssert = false;
|
||||||
@@ -801,24 +801,77 @@ void wxOnAssert(const wxChar *szFile,
|
|||||||
|
|
||||||
s_bInAssert = true;
|
s_bInAssert = true;
|
||||||
|
|
||||||
// __FUNCTION__ is always in ASCII, convert it to wide char if needed
|
|
||||||
const wxString strFunc = wxString::FromAscii(szFunc);
|
|
||||||
|
|
||||||
if ( !wxTheApp )
|
if ( !wxTheApp )
|
||||||
{
|
{
|
||||||
// by default, show the assert dialog box -- we can't customize this
|
// by default, show the assert dialog box -- we can't customize this
|
||||||
// behaviour
|
// behaviour
|
||||||
ShowAssertDialog(szFile, nLine, strFunc, szCond, szMsg);
|
ShowAssertDialog(szFile, nLine, szFunc, szCond, szMsg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// let the app process it as it wants
|
// 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;
|
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__
|
#endif // __WXDEBUG__
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -879,11 +932,11 @@ bool DoShowAssertDialog(const wxString& msg)
|
|||||||
|
|
||||||
// show the assert modal dialog
|
// show the assert modal dialog
|
||||||
static
|
static
|
||||||
void ShowAssertDialog(const wxChar *szFile,
|
void ShowAssertDialog(const wxString& szFile,
|
||||||
int nLine,
|
int nLine,
|
||||||
const wxChar *szFunc,
|
const wxString& szFunc,
|
||||||
const wxChar *szCond,
|
const wxString& szCond,
|
||||||
const wxChar *szMsg,
|
const wxString& szMsg,
|
||||||
wxAppTraits *traits)
|
wxAppTraits *traits)
|
||||||
{
|
{
|
||||||
// this variable can be set to true to suppress "assert failure" messages
|
// 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);
|
msg.Printf(wxT("%s(%d): assert \"%s\" failed"), szFile, nLine, szCond);
|
||||||
|
|
||||||
// add the function name, if any
|
// add the function name, if any
|
||||||
if ( szFunc && *szFunc )
|
if ( !szFunc.empty() )
|
||||||
msg << _T(" in ") << szFunc << _T("()");
|
msg << _T(" in ") << szFunc << _T("()");
|
||||||
|
|
||||||
// and the message itself
|
// and the message itself
|
||||||
if ( szMsg )
|
if ( !szMsg.empty() )
|
||||||
{
|
{
|
||||||
msg << _T(": ") << szMsg;
|
msg << _T(": ") << szMsg;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user