]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/stackwalk.cpp
Fixed copying only 1/3 of scanline when saving TIFF image in rare cases.
[wxWidgets.git] / src / unix / stackwalk.cpp
index 2e6a5ccda44596af6d83e5c444e28ef0eedc56a9..6c234adbea4b33120309d5e9f68672ff0cdafa1f 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        msw/stackwalk.cpp
+// Name:        src/unix/stackwalk.cpp
 // Purpose:     wxStackWalker implementation for Unix/glibc
 // Author:      Vadim Zeitlin
 // Modified by:
@@ -67,7 +67,7 @@ public:
 private:
     FILE *m_fp;
 
-    DECLARE_NO_COPY_CLASS(wxStdioPipe)
+    wxDECLARE_NO_COPY_CLASS(wxStdioPipe);
 };
 
 // ============================================================================
@@ -92,13 +92,13 @@ void wxStackFrame::OnGetName()
     // format is: "module(funcname+offset) [address]" but the part in
     // parentheses can be not present
     wxString syminfo = wxString::FromAscii(m_syminfo);
-    const size_t posOpen = syminfo.find(_T('('));
+    const size_t posOpen = syminfo.find(wxT('('));
     if ( posOpen != wxString::npos )
     {
-        const size_t posPlus = syminfo.find(_T('+'), posOpen + 1);
+        const size_t posPlus = syminfo.find(wxT('+'), posOpen + 1);
         if ( posPlus != wxString::npos )
         {
-            const size_t posClose = syminfo.find(_T(')'), posPlus + 1);
+            const size_t posClose = syminfo.find(wxT(')'), posPlus + 1);
             if ( posClose != wxString::npos )
             {
                 if ( m_name.empty() )
@@ -222,7 +222,7 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha
 
     // build the (long) command line for executing addr2line in an optimized way
     // (e.g. use always chars, even in Unicode build: popen() always takes chars)
-    int len = snprintf(g_buf, BUFSIZE, "addr2line -C -f -e \"%s\"", exepath.mb_str());
+    int len = snprintf(g_buf, BUFSIZE, "addr2line -C -f -e \"%s\"", (const char*) exepath.mb_str());
     len = (len <= 0) ? strlen(g_buf) : len;     // in case snprintf() is broken
     for (size_t i=0; i<n; i++)
     {
@@ -239,8 +239,9 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha
     // parse addr2line output (should be exactly 2 lines for each address)
     // reusing the g_buf used for building the command line above
     wxString name, filename;
-    unsigned long line, curr=0;
-    for (size_t i=0; i<n; i++)
+    unsigned long line = 0,
+                  curr = 0;
+    for  ( size_t i = 0; i < n; i++ )
     {
         // 1st line has function name
         if ( fgets(g_buf, WXSIZEOF(g_buf), fp) )
@@ -248,12 +249,13 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha
             name = wxString::FromAscii(g_buf);
             name.RemoveLast(); // trailing newline
 
-            if ( name == _T("??") )
+            if ( name == wxT("??") )
                 name.clear();
         }
         else
         {
-            wxLogDebug(_T("cannot read addr2line output for %d-th stack frame!"), i);
+            wxLogDebug(wxT("cannot read addr2line output for stack frame #%lu"),
+                       (unsigned long)i);
             return false;
         }
 
@@ -263,32 +265,30 @@ int wxStackWalker::InitFrames(wxStackFrame *arr, size_t n, void **addresses, cha
             filename = wxString::FromAscii(g_buf);
             filename.RemoveLast();
 
-            const size_t posColon = filename.find(_T(':'));
+            const size_t posColon = filename.find(wxT(':'));
             if ( posColon != wxString::npos )
             {
-                // parse line number
-                if ( !wxString(filename, posColon + 1, wxString::npos).
-                        ToULong(&line) )
-                    line = 0;
+                // parse line number (it's ok if it fails, this will just leave
+                // line at its current, invalid, 0 value)
+                wxString(filename, posColon + 1, wxString::npos).ToULong(&line);
 
                 // remove line number from 'filename'
                 filename.erase(posColon);
-                if ( filename == _T("??") )
+                if ( filename == wxT("??") )
                     filename.clear();
             }
             else
             {
-                wxLogDebug(_T("Unexpected addr2line format: \"%s\" - ")
-                           _T("the semicolon is missing"),
+                wxLogDebug(wxT("Unexpected addr2line format: \"%s\" - ")
+                           wxT("the semicolon is missing"),
                            filename.c_str());
             }
         }
 
-        if (!name.empty() || !filename.empty())
-        {
-            // now we've got enough info to initialize curr-th stack frame:
-            arr[curr++].Set(name, filename, syminfo[i], i, line, addresses[i]);
-        }
+        // now we've got enough info to initialize curr-th stack frame
+        // (at worst, only addresses[i] and syminfo[i] have been initialized,
+        //  but wxStackFrame::OnGetName may still be able to get function name):
+        arr[curr++].Set(name, filename, syminfo[i], i, line, addresses[i]);
     }
 
     return curr;