]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/unix/stackwalk.h
use a virtual function instead of wxDynamicCast(wxMDIParentFrame) in wxFrame code...
[wxWidgets.git] / include / wx / unix / stackwalk.h
index 77aebf52f3fbd9881bbd6f9144fc3986d4dcc0ae..c26883b2058772b3c6a506aebf9547c65a74e8c8 100644 (file)
 
 class WXDLLIMPEXP_BASE wxStackFrame : public wxStackFrameBase
 {
+    friend class wxStackWalker;
+
 public:
     // arguments are the stack depth of this frame, its address and the return
     // value of backtrace_symbols() for it
     //
     // NB: we don't copy syminfo pointer so it should have lifetime at least as
     //     long as ours
-    wxStackFrame(size_t level, void *address, const char *syminfo)
+    wxStackFrame(size_t level = 0, void *address = NULL, const char *syminfo = NULL)
         : wxStackFrameBase(level, address)
     {
-        m_hasName =
-        m_hasLocation = false;
-
         m_syminfo = syminfo;
     }
 
 protected:
     virtual void OnGetName();
-    virtual void OnGetLocation();
+
+    // optimized for the 2 step initialization done by wxStackWalker
+    void Set(const wxString &name, const wxString &filename, const char* syminfo,
+             size_t level, size_t numLine, void *address)
+    {
+        m_level = level;
+        m_name = name;
+        m_filename = filename;
+        m_syminfo = syminfo;
+
+        m_line = numLine;
+        m_address = address;
+    }
 
 private:
     const char *m_syminfo;
-
-    bool m_hasName,
-         m_hasLocation;
 };
 
 // ----------------------------------------------------------------------------
@@ -55,15 +63,37 @@ public:
     // addr2line, normally we can retrieve it from wxTheApp but if wxTheApp
     // doesn't exist or doesn't have the correct value, the path may be given
     // explicitly
-    wxStackWalker(const char *argv0 = NULL) { ms_exepath = argv0; }
+    wxStackWalker(const char *argv0 = NULL)
+    {
+        ms_exepath = wxString::FromAscii(argv0);
+    }
+
+    ~wxStackWalker()
+    {
+        FreeStack();
+    }
 
-    virtual void Walk(size_t skip = 1);
-    virtual void WalkFromException() { Walk(2); }
+    virtual void Walk(size_t skip = 1, size_t maxDepth = wxSTACKWALKER_MAX_DEPTH);
+#if wxUSE_ON_FATAL_EXCEPTION
+    virtual void WalkFromException(size_t maxDepth = wxSTACKWALKER_MAX_DEPTH) { Walk(2, maxDepth); }
+#endif // wxUSE_ON_FATAL_EXCEPTION
 
     static const wxString& GetExePath() { return ms_exepath; }
 
+
+    // these two may be used to save the stack at some point (fast operation)
+    // and then process it later (slow operation)
+    void SaveStack(size_t maxDepth);
+    void ProcessFrames(size_t skip);
+    void FreeStack();
+
 private:
+    int InitFrames(wxStackFrame *arr, size_t n, void **addresses, char **syminfo);
+
     static wxString ms_exepath;
+    static void *ms_addresses[];
+    static char **ms_symbols;
+    static int m_depth;
 };
 
 #endif // _WX_UNIX_STACKWALK_H_