From 83609d6f724752c61db520613f0e5ca3ba64e6a5 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Wed, 19 Mar 2003 22:09:59 +0000 Subject: [PATCH] Fixed a interpreter lock problem in the __eq__ and __ne__ methods in wxSize and etc. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@19623 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/CHANGES.txt | 2 ++ wxPython/src/gdi.i | 14 ++++++----- wxPython/src/helpers.cpp | 19 +++++++++++++- wxPython/src/helpers.h | 2 ++ wxPython/src/misc.i | 54 +++++++++++++++++++++++++--------------- 5 files changed, 64 insertions(+), 27 deletions(-) diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt index dd79ff8896..124170f4d2 100644 --- a/wxPython/CHANGES.txt +++ b/wxPython/CHANGES.txt @@ -17,6 +17,8 @@ unicode. Fixed problem where the wrong class name could sometimes be used for OOR. +Fixed a interpreter lock problem in the __eq__ and __ne__ methods in +wxSize and etc. diff --git a/wxPython/src/gdi.i b/wxPython/src/gdi.i index 75429b90b2..89ff2da8e2 100644 --- a/wxPython/src/gdi.i +++ b/wxPython/src/gdi.i @@ -368,22 +368,24 @@ public: bool __eq__(PyObject* obj) { wxColour tmp; wxColour* ptr = &tmp; - if (obj == Py_None) return FALSE; - if (! wxColour_helper(obj, &ptr)) return FALSE; + if (obj == Py_None) return FALSE; + wxPyBLOCK_THREADS(bool success = wxColour_helper(obj, &ptr); PyErr_Clear()); + if (! success) return FALSE; return *self == *ptr; } bool __ne__(PyObject* obj) { wxColour tmp; wxColour* ptr = &tmp; - if (obj == Py_None) return TRUE; - if (! wxColour_helper(obj, &ptr)) return TRUE; + if (obj == Py_None) return TRUE; + wxPyBLOCK_THREADS(bool success = wxColour_helper(obj, &ptr); PyErr_Clear()); + if (! success) return TRUE; return *self != *ptr; } - } + %pragma(python) addtoclass = "asTuple = Get def __str__(self): return str(self.asTuple()) - def __repr__(self): return 'wxColour: ' + str(self.asTuple()) + def __repr__(self): return 'wxColour:' + str(self.asTuple()) def __nonzero__(self): return self.Ok() def __getinitargs__(self): return () def __getstate__(self): return self.asTuple() diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index 118f419230..cb2a1eeb38 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -2224,7 +2224,7 @@ bool wxColour_helper(PyObject* source, wxColour** obj) { *obj = ptr; return TRUE; } - // otherwise a string is expected + // otherwise check for a string else if (PyString_Check(source) || PyUnicode_Check(source)) { wxString spec = Py2wxString(source); if (spec.GetChar(0) == '#' && spec.Length() == 7) { // It's #RRGGBB @@ -2242,6 +2242,23 @@ bool wxColour_helper(PyObject* source, wxColour** obj) { return TRUE; } } + // last chance: 3-tuple of integers is expected + else if (PySequence_Check(source) && PyObject_Length(source) == 3) { + PyObject* o1 = PySequence_GetItem(source, 0); + PyObject* o2 = PySequence_GetItem(source, 1); + PyObject* o3 = PySequence_GetItem(source, 2); + if (!PyNumber_Check(o1) || !PyNumber_Check(o2) || !PyNumber_Check(o3)) { + Py_DECREF(o1); + Py_DECREF(o2); + Py_DECREF(o3); + goto error; + } + **obj = wxColour(PyInt_AsLong(o1), PyInt_AsLong(o2), PyInt_AsLong(o3)); + Py_DECREF(o1); + Py_DECREF(o2); + Py_DECREF(o3); + return TRUE; + } error: PyErr_SetString(PyExc_TypeError, diff --git a/wxPython/src/helpers.h b/wxPython/src/helpers.h index 75e3f1b36b..dc14a66fe7 100644 --- a/wxPython/src/helpers.h +++ b/wxPython/src/helpers.h @@ -66,6 +66,8 @@ void wxPyEndAllowThreads(PyThreadState* state); void wxPyBeginBlockThreads(); void wxPyEndBlockThreads(); +#define wxPyBLOCK_THREADS(stmt) wxPyBeginBlockThreads(); stmt; wxPyEndBlockThreads() + //---------------------------------------------------------------------- // These are helpers used by the typemaps diff --git a/wxPython/src/misc.i b/wxPython/src/misc.i index 8887c653f1..1719b55c64 100644 --- a/wxPython/src/misc.i +++ b/wxPython/src/misc.i @@ -83,15 +83,17 @@ public: bool __eq__(PyObject* obj) { wxSize tmp; wxSize* ptr = &tmp; - if (obj == Py_None) return FALSE; - if (! wxSize_helper(obj, &ptr)) return FALSE; + if (obj == Py_None) return FALSE; + wxPyBLOCK_THREADS(bool success = wxSize_helper(obj, &ptr); PyErr_Clear()); + if (! success) return FALSE; return *self == *ptr; } bool __ne__(PyObject* obj) { wxSize tmp; wxSize* ptr = &tmp; - if (obj == Py_None) return TRUE; - if (! wxSize_helper(obj, &ptr)) return TRUE; + if (obj == Py_None) return TRUE; + wxPyBLOCK_THREADS(bool success = wxSize_helper(obj, &ptr); PyErr_Clear()); + if (! success) return TRUE; return *self != *ptr; } @@ -148,17 +150,20 @@ public: bool __eq__(PyObject* obj) { wxRealPoint tmp; wxRealPoint* ptr = &tmp; - if (obj == Py_None) return FALSE; - if (! wxRealPoint_helper(obj, &ptr)) return FALSE; + if (obj == Py_None) return FALSE; + wxPyBLOCK_THREADS(bool success = wxRealPoint_helper(obj, &ptr); PyErr_Clear()); + if (! success) return FALSE; return *self == *ptr; } bool __ne__(PyObject* obj) { wxRealPoint tmp; wxRealPoint* ptr = &tmp; - if (obj == Py_None) return TRUE; - if (! wxRealPoint_helper(obj, &ptr)) return TRUE; + if (obj == Py_None) return TRUE; + wxPyBLOCK_THREADS(bool success = wxRealPoint_helper(obj, &ptr); PyErr_Clear()); + if (! success) return TRUE; return *self != *ptr; } + } %pragma(python) addtoclass = " @@ -210,17 +215,20 @@ public: bool __eq__(PyObject* obj) { wxPoint tmp; wxPoint* ptr = &tmp; - if (obj == Py_None) return FALSE; - if (! wxPoint_helper(obj, &ptr)) return FALSE; + if (obj == Py_None) return FALSE; + wxPyBLOCK_THREADS(bool success = wxPoint_helper(obj, &ptr); PyErr_Clear()); + if (! success) return FALSE; return *self == *ptr; } bool __ne__(PyObject* obj) { wxPoint tmp; wxPoint* ptr = &tmp; - if (obj == Py_None) return TRUE; - if (! wxPoint_helper(obj, &ptr)) return TRUE; + if (obj == Py_None) return TRUE; + wxPyBLOCK_THREADS(bool success = wxPoint_helper(obj, &ptr); PyErr_Clear()); + if (! success) return TRUE; return *self != *ptr; } + } %pragma(python) addtoclass = " @@ -308,17 +316,20 @@ public: bool __eq__(PyObject* obj) { wxRect tmp; wxRect* ptr = &tmp; - if (obj == Py_None) return FALSE; - if (! wxRect_helper(obj, &ptr)) return FALSE; + if (obj == Py_None) return FALSE; + wxPyBLOCK_THREADS(bool success = wxRect_helper(obj, &ptr); PyErr_Clear()); + if (! success) return FALSE; return *self == *ptr; } bool __ne__(PyObject* obj) { wxRect tmp; wxRect* ptr = &tmp; - if (obj == Py_None) return TRUE; - if (! wxRect_helper(obj, &ptr)) return TRUE; + if (obj == Py_None) return TRUE; + wxPyBLOCK_THREADS(bool success = wxRect_helper(obj, &ptr); PyErr_Clear()); + if (! success) return TRUE; return *self != *ptr; } + } %pragma(python) addtoclass = " @@ -467,18 +478,21 @@ public: bool __eq__(PyObject* obj) { wxPoint2DDouble tmp; wxPoint2DDouble* ptr = &tmp; - if (obj == Py_None) return FALSE; - if (! wxPoint2DDouble_helper(obj, &ptr)) return FALSE; + if (obj == Py_None) return FALSE; + wxPyBLOCK_THREADS(bool success = wxPoint2DDouble_helper(obj, &ptr); PyErr_Clear()); + if (! success) return FALSE; return *self == *ptr; } bool __ne__(PyObject* obj) { wxPoint2DDouble tmp; wxPoint2DDouble* ptr = &tmp; - if (obj == Py_None) return TRUE; - if (! wxPoint2DDouble_helper(obj, &ptr)) return TRUE; + if (obj == Py_None) return TRUE; + wxPyBLOCK_THREADS(bool success = wxPoint2DDouble_helper(obj, &ptr); PyErr_Clear()); + if (! success) return TRUE; return *self != *ptr; } + PyObject* asTuple() { wxPyBeginBlockThreads(); PyObject* tup = PyTuple_New(2);