From 96d38c7e0df2138cff3505dbba7d93111254ba5f Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Tue, 21 Jun 2005 09:56:18 +0000 Subject: [PATCH] rolled back exceptions handling patch, it relied on incorrect assumption about vtables git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34721 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/app.h | 6 --- include/wx/event.h | 13 +----- include/wx/object.h | 8 +--- src/common/appbase.cpp | 11 +---- src/common/appcmn.cpp | 30 -------------- src/common/event.cpp | 8 ---- src/msw/evtloop.cpp | 92 +++++++++++++++++++++++++++--------------- 7 files changed, 64 insertions(+), 104 deletions(-) diff --git a/include/wx/app.h b/include/wx/app.h index 334c4d7c20..02c5aee54d 100644 --- a/include/wx/app.h +++ b/include/wx/app.h @@ -433,12 +433,6 @@ public: // Perform standard OnIdle behaviour: call from port's OnIdle void OnIdle(wxIdleEvent& event); -#if wxUSE_EXCEPTIONS - virtual void HandleEvent(wxEvtHandler *handler, - wxEventFunction func, - wxEvent& event) const; -#endif // wxUSE_EXCEPTIONS - // top level window functions // -------------------------- diff --git a/include/wx/event.h b/include/wx/event.h index c8dda1ec36..2e083e46b5 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -2295,8 +2295,6 @@ protected: // wxEvtHandler: the base class for all objects handling wxWidgets events // ---------------------------------------------------------------------------- -typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); - class WXDLLIMPEXP_BASE wxEvtHandler : public wxObject { public: @@ -2324,15 +2322,6 @@ public: bool ProcessThreadEvent(wxEvent& event); #endif -#if wxUSE_EXCEPTIONS - // call the specified handler with the given event - // - // this method only exists to allow catching the exceptions thrown by any - // event handler, it would lead to an extra (useless) virtual function call - // if the exceptions were not used, so it doesn't even exist in that case - virtual void DoHandleEvent(wxEventFunction func, wxEvent& event); -#endif // wxUSE_EXCEPTIONS - // Dynamic association of a member function handler with the event handler, // winid and event type void Connect(int winid, @@ -2493,6 +2482,8 @@ inline void wxPostEvent(wxEvtHandler *dest, wxEvent& event) dest->AddPendingEvent(event); } +typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); + #define wxEventHandler(func) \ (wxObjectEventFunction)wxStaticCastEvent(wxEventFunction, &func) diff --git a/include/wx/object.h b/include/wx/object.h index b88a0d850a..8f949c0979 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -26,10 +26,6 @@ class WXDLLIMPEXP_BASE wxObject; -// FIXME: remove in wx-2.7: -class WXDLLIMPEXP_BASE wxEvent; -class WXDLLIMPEXP_BASE wxEvtHandler; - #ifndef wxUSE_EXTENDED_RTTI #define wxUSE_EXTENDED_RTTI 0 #endif @@ -482,9 +478,7 @@ public: virtual void ReservedObjectFunc6() {} virtual void ReservedObjectFunc7() {} virtual void ReservedObjectFunc8() {} - // FIXME: turn back into ReservedObjectFunc9() in wx-2.7 (see also FIXME - // near the top of this file) - virtual void DoHandleEvent(void (wxEvtHandler::*)(wxEvent&), wxEvent&) {} + virtual void ReservedObjectFunc9() {} protected: // ensure that our data is not shared with anybody else: if we have no diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index d9f65368b6..0892aab62d 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -316,15 +316,8 @@ wxAppConsole::HandleEvent(wxEvtHandler *handler, wxEventFunction func, wxEvent& event) const { - // by default, call wxApp::OnExceptionInMainLoop if an exception occurs - try - { - handler->DoHandleEvent(func, event); - } - catch ( ... ) - { - wxConstCast(this, wxAppConsole)->OnExceptionInMainLoop(); - } + // by default, simply call the handler + (handler->*func)(event); } bool diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index e5d27ef093..dddd390ab5 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -46,7 +46,6 @@ #include "wx/thread.h" #include "wx/utils.h" #include "wx/ptr_scpd.h" -#include "wx/evtloop.h" #if defined(__WXMSW__) #include "wx/msw/private.h" // includes windows.h for LOGFONT @@ -468,35 +467,6 @@ void wxAppBase::OnIdle(wxIdleEvent& WXUNUSED(event)) } -// ---------------------------------------------------------------------------- -// exception handling -// ---------------------------------------------------------------------------- - -#if wxUSE_EXCEPTIONS - -void wxAppBase::HandleEvent(wxEvtHandler *handler, - wxEventFunction func, - wxEvent& event) const -{ - // by default, call wxApp::OnExceptionInMainLoop if an exception occurs - try - { - handler->DoHandleEvent(func, event); - } - catch ( ... ) - { - if ( !wxConstCast(this, wxAppBase)->OnExceptionInMainLoop() ) - { - wxEventLoop *loop = wxEventLoop::GetActive(); - if ( loop ) - loop->Exit(-1); - } - //else: continue running the event loop - } -} - -#endif // wxUSE_EXCEPTIONS - // ---------------------------------------------------------------------------- // wxGUIAppTraitsBase // ---------------------------------------------------------------------------- diff --git a/src/common/event.cpp b/src/common/event.cpp index 648c80e2b7..ae6acd1979 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -1081,14 +1081,6 @@ void wxEvtHandler::ClearEventLocker() #endif // wxUSE_THREADS -#if wxUSE_EXCEPTIONS -void wxEvtHandler::DoHandleEvent(wxEventFunction func, wxEvent& event) -{ - // by default, just call then handler - (this->*func)(event); -} -#endif // wxUSE_EXCEPTIONS - void wxEvtHandler::AddPendingEvent(wxEvent& event) { // 1) Add event to list of pending events of this event handler diff --git a/src/msw/evtloop.cpp b/src/msw/evtloop.cpp index 27877fa3f2..4325bbdd0a 100644 --- a/src/msw/evtloop.cpp +++ b/src/msw/evtloop.cpp @@ -207,48 +207,74 @@ int wxEventLoop::Run() // should undo wxEventLoopActivator activate(&ms_activeLoop, this); + // we must ensure that OnExit() is called even if an exception is thrown + // from inside Dispatch() but we must call it from Exit() in normal + // situations because it is supposed to be called synchronously, + // wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or + // something similar here) #if wxUSE_EXCEPTIONS - try + for ( ;; ) { -#endif - // this is the event loop itself - for ( ;; ) + try { - #if wxUSE_THREADS - wxMutexGuiLeaveOrEnter(); - #endif // wxUSE_THREADS - - // generate and process idle events for as long as we don't - // have anything else to do - while ( !Pending() && (wxTheApp && wxTheApp->ProcessIdle()) ) - ; - - // if the "should exit" flag is set, the loop should terminate - // but not before processing any remaining messages so while - // Pending() returns true, do process them - if ( m_shouldExit ) - { - while ( Pending() ) - Dispatch(); +#endif // wxUSE_EXCEPTIONS - break; + // this is the event loop itself + for ( ;; ) + { + #if wxUSE_THREADS + wxMutexGuiLeaveOrEnter(); + #endif // wxUSE_THREADS + + // generate and process idle events for as long as we don't + // have anything else to do + while ( !Pending() && (wxTheApp && wxTheApp->ProcessIdle()) ) + ; + + // if the "should exit" flag is set, the loop should terminate + // but not before processing any remaining messages so while + // Pending() returns true, do process them + if ( m_shouldExit ) + { + while ( Pending() ) + Dispatch(); + + break; + } + + // a message came or no more idle processing to do, sit in + // Dispatch() waiting for the next message + if ( !Dispatch() ) + { + // we got WM_QUIT + break; + } } - // a message came or no more idle processing to do, sit in - // Dispatch() waiting for the next message - if ( !Dispatch() ) +#if wxUSE_EXCEPTIONS + // exit the outer loop as well + break; + } + catch ( ... ) + { + try + { + if ( !wxTheApp || !wxTheApp->OnExceptionInMainLoop() ) + { + OnExit(); + break; + } + //else: continue running the event loop + } + catch ( ... ) { - // we got WM_QUIT - break; + // OnException() throwed, possibly rethrowing the same + // exception again: very good, but we still need OnExit() to + // be called + OnExit(); + throw; } } -#if wxUSE_EXCEPTIONS - } - catch ( ... ) - { - // we need OnExit() to be called before the event loop stops - OnExit(); - throw; } #endif // wxUSE_EXCEPTIONS -- 2.45.2