]> git.saurik.com Git - wxWidgets.git/commitdiff
1. make debugging macros compatible with ANSI build even in Unicode build (i.e.,...
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 21 May 2007 18:02:57 +0000 (18:02 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 21 May 2007 18:02:57 +0000 (18:02 +0000)
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
include/wx/log.h
src/common/appbase.cpp

index f7815a9844da32e8e10acbf40e23945e656cbd80..146e6d1ab0653f251f0ff657a51c3a9a56e1a461 100644 (file)
        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 */
       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 */
 */
 
 /*  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 */
 
index c547984bb925f8046eecdec9b106bad19d97f773..8eb4cf7f3b613eb5ef5cc91693265de8ac73e8de 100644 (file)
@@ -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++
 
index 63b5ceb46b7c10245c38faa029358e46c8a5131a..477935187fdcc77878457fe75c4079bc2137f8d4 100644 (file)
     // 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;
     }