X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a80e5f9e5b9d3d79865a0140caa714fafcd3808c..0f8d64613453a9dbd306087956c8308ffda82a02:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index 72c8968ed4..e6d803cbe4 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -35,6 +35,7 @@ #include "wx/ptr_scpd.h" #include "wx/module.h" +#include "wx/except.h" #if defined(__WXMSW__) && defined(__WXDEBUG__) #include "wx/msw/msvcrt.h" @@ -68,13 +69,13 @@ public: // we need a special kind of auto pointer to wxApp which not only deletes the // pointer it holds in its dtor but also resets the global application pointer -wxDECLARE_SCOPED_PTR(wxApp, wxAppPtrBase); -wxDEFINE_SCOPED_PTR(wxApp, wxAppPtrBase); +wxDECLARE_SCOPED_PTR(wxAppConsole, wxAppPtrBase); +wxDEFINE_SCOPED_PTR(wxAppConsole, wxAppPtrBase); class wxAppPtr : public wxAppPtrBase { public: - wxEXPLICIT wxAppPtr(wxApp *ptr = NULL) : wxAppPtrBase(ptr) { } + wxEXPLICIT wxAppPtr(wxAppConsole *ptr = NULL) : wxAppPtrBase(ptr) { } ~wxAppPtr() { if ( get() ) @@ -85,7 +86,7 @@ public: } } - void Set(wxApp *ptr) + void Set(wxAppConsole *ptr) { reset(ptr); @@ -100,13 +101,13 @@ public: class wxCallAppCleanup { public: - wxCallAppCleanup(wxApp *app) : m_app(app) { } + wxCallAppCleanup(wxAppConsole *app) : m_app(app) { } ~wxCallAppCleanup() { if ( m_app ) m_app->CleanUp(); } void Dismiss() { m_app = NULL; } private: - wxApp *m_app; + wxAppConsole *m_app; }; // another tiny class which simply exists to ensure that wxEntryCleanup is @@ -206,8 +207,6 @@ static void FreeConvertedArgs() // initialization which is always done (not customizable) before wxApp creation static bool DoCommonPreInit() { - wxClassInfo::InitializeClasses(); - return true; } @@ -331,7 +330,7 @@ static void DoCommonPreCleanup() // cleanup done after destroying wxTheApp static void DoCommonPostCleanup() { - wxClassInfo::CleanUpClasses(); + wxClassInfo::CleanUp(); // we can't do this in wxApp itself because it doesn't know if argv had // been allocated @@ -339,6 +338,7 @@ static void DoCommonPostCleanup() FreeConvertedArgs(); #endif // wxUSE_UNICODE + // Note: check for memory leaks is now done via wxDebugContextDumpDelayCounter #if wxUSE_LOG // and now delete the last logger as well delete wxLog::SetActiveTarget(NULL); @@ -361,17 +361,6 @@ void wxEntryCleanup() DoCommonPostCleanup(); - - // check for memory leaks -#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT - if (wxDebugContext::CountObjectsLeft(TRUE) > 0) - { - wxLogDebug(wxT("There were memory leaks.\n")); - wxDebugContext::Dump(); - wxDebugContext::PrintStatistics(); - } -#endif // Debug - } // ---------------------------------------------------------------------------- @@ -396,20 +385,29 @@ int wxEntryReal(int& argc, wxChar **argv) WX_SUPPRESS_UNUSED_WARN(cleanupOnExit); - // app initialization - if ( !wxTheApp->CallOnInit() ) + wxTRY { - // don't call OnExit() if OnInit() failed - return -1; - } - // app execution - int retValue = wxTheApp->OnRun(); + // app initialization + if ( !wxTheApp->CallOnInit() ) + { + // don't call OnExit() if OnInit() failed + return -1; + } + + // ensure that OnExit() is called if OnInit() had succeeded + class CallOnExit + { + public: + ~CallOnExit() { wxTheApp->OnExit(); } + } callOnExit; - // app clean up - wxTheApp->OnExit(); + WX_SUPPRESS_UNUSED_WARN(callOnExit); - return retValue; + // app execution + return wxTheApp->OnRun(); + } + wxCATCH_ALL( wxTheApp->OnUnhandledException(); return -1; ) } // wrap real wxEntry in a try-except block to be able to call