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:
parent
a64be16ef8
commit
0accd1cfe8
@ -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 */
|
||||
|
||||
|
@ -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++
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user