X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/99a001dd43b3b2b23ea5787c7a94c5328e3c3375..955e46d25d6ac0f9fa55ec9fe11f0c21da3a494d:/wxPython/src/helpers.cpp?ds=sidebyside diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index f45bafc9bb..d4c30cce5f 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -16,6 +16,7 @@ #include "wx/wxPython/wxPython_int.h" #include "wx/wxPython/pyistream.h" #include "wx/wxPython/swigver.h" +#include "wx/wxPython/twoitem.h" #ifdef __WXMSW__ #include @@ -190,21 +191,23 @@ void wxPyApp::ExitMainLoop() { #ifdef __WXDEBUG__ -void wxPyApp::OnAssert(const wxChar *file, - int line, - const wxChar *cond, - const wxChar *msg) { - +void wxPyApp::OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg) +{ // if we're not fully initialized then just log the error if (! m_startupComplete) { wxString buf; buf.Alloc(4096); buf.Printf(wxT("%s(%d): assert \"%s\" failed"), file, line, cond); - if (msg != NULL) { - buf += wxT(": "); - buf += msg; - } + if ( func && *func ) + buf << wxT(" in ") << func << wxT("()"); + if (msg != NULL) + buf << wxT(": ") << msg; + wxLogDebug(buf); return; } @@ -238,11 +241,12 @@ void wxPyApp::OnAssert(const wxChar *file, if (m_assertMode & wxPYAPP_ASSERT_EXCEPTION) { wxString buf; buf.Alloc(4096); - buf.Printf(wxT("C++ assertion \"%s\" failed in %s(%d)"), cond, file, line); - if (msg != NULL) { - buf += wxT(": "); - buf += msg; - } + buf.Printf(wxT("C++ assertion \"%s\" failed at %s(%d)"), cond, file, line); + if ( func && *func ) + buf << wxT(" in ") << func << wxT("()"); + if (msg != NULL) + buf << wxT(": ") << msg; + // set the exception wxPyBlock_t blocked = wxPyBeginBlockThreads(); @@ -263,16 +267,16 @@ void wxPyApp::OnAssert(const wxChar *file, buf.Alloc(4096); buf.Printf(wxT("%s(%d): assert \"%s\" failed"), file, line, cond); - if (msg != NULL) { - buf += wxT(": "); - buf += msg; - } + if ( func && *func ) + buf << wxT(" in ") << func << wxT("()"); + if (msg != NULL) + buf << wxT(": ") << msg; wxLogDebug(buf); } // do the normal wx assert dialog? if (m_assertMode & wxPYAPP_ASSERT_DIALOG) - wxApp::OnAssert(file, line, cond, msg); + wxApp::OnAssertFailure(file, line, func, cond, msg); } } #endif @@ -469,8 +473,19 @@ void wxPyApp::_BootstrapApp() // It's now ok to generate exceptions for assertion errors. wxPythonApp->SetStartupComplete(true); - // Call the Python wxApp's OnInit function + + // Call the Python wxApp's OnPreInit and OnInit functions blocked = wxPyBeginBlockThreads(); + if (wxPyCBH_findCallback(m_myInst, "OnPreInit")) { + PyObject* method = m_myInst.GetLastFound(); + PyObject* argTuple = PyTuple_New(0); + retval = PyEval_CallObject(method, argTuple); + m_myInst.clearRecursionGuard(method); + Py_DECREF(argTuple); + Py_DECREF(method); + if (retval == NULL) + goto error; + } if (wxPyCBH_findCallback(m_myInst, "OnInit")) { PyObject* method = m_myInst.GetLastFound(); @@ -1863,7 +1878,7 @@ wxString* wxString_in_helper(PyObject* source) { str = PyObject_Str(source); if (PyErr_Occurred()) return NULL; } - char* tmpPtr; int tmpSize; + char* tmpPtr; Py_ssize_t tmpSize; PyString_AsStringAndSize(str, &tmpPtr, &tmpSize); target = new wxString(tmpPtr, tmpSize); @@ -1906,7 +1921,7 @@ wxString Py2wxString(PyObject* source) str = PyObject_Str(source); if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear? } - char* tmpPtr; int tmpSize; + char* tmpPtr; Py_ssize_t tmpSize; PyString_AsStringAndSize(str, &tmpPtr, &tmpSize); target = wxString(tmpPtr, tmpSize);