diff --git a/SWIG/Lib/python/pycontainer.swg b/SWIG/Lib/python/pycontainer.swg index 0a717d1b3..ccac7e968 100644 --- a/SWIG/Lib/python/pycontainer.swg +++ b/SWIG/Lib/python/pycontainer.swg @@ -273,9 +273,7 @@ namespace swig { %ignore stop_iteration; %typemap(throws) stop_iteration { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; - PyErr_SetObject(PyExc_StopIteration, SWIG_Py_Void()); - SWIG_PYTHON_THREAD_END_BLOCK; + SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } @@ -494,7 +492,6 @@ namespace swig try { return swig::as(item, true); } catch (std::exception& e) { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; char msg[1024]; snprintf(msg, sizeof(msg), "in sequence element %d ", _index); if (!PyErr_Occurred()) { @@ -502,7 +499,6 @@ namespace swig } SWIG_Python_AddErrorMsg(msg); SWIG_Python_AddErrorMsg(e.what()); - SWIG_PYTHON_THREAD_END_BLOCK; throw; } } @@ -913,11 +909,9 @@ namespace swig } } catch (std::exception& e) { if (seq) { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, e.what()); } - SWIG_PYTHON_THREAD_END_BLOCK; } return 0; } @@ -955,10 +949,8 @@ namespace swig } return obj; } else { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "sequence size not valid in python"); - SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } } diff --git a/SWIG/Lib/python/pyinit.swg b/SWIG/Lib/python/pyinit.swg index c3b9ff411..bcac1beb6 100644 --- a/SWIG/Lib/python/pyinit.swg +++ b/SWIG/Lib/python/pyinit.swg @@ -61,36 +61,36 @@ swig_varlink_dealloc(swig_varlinkobject *v) { SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { - PyObject *obj = (*var->get_attr)(); - SWIG_PYTHON_THREAD_END_BLOCK; - return obj; + res = (*var->get_attr)(); + break; } var = var->next; } - PyErr_SetString(PyExc_NameError,"Unknown C global variable"); - SWIG_PYTHON_THREAD_END_BLOCK; - return NULL; + if (res == NULL && !PyErr_Occurred()) { + PyErr_SetString(PyExc_NameError,"Unknown C global variable"); + } + return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { - SWIG_PYTHON_THREAD_BEGIN_BLOCK; + int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { - int res = (*var->set_attr)(p); - SWIG_PYTHON_THREAD_END_BLOCK; - return res; + res = (*var->set_attr)(p); + break; } var = var->next; } - PyErr_SetString(PyExc_NameError,"Unknown C global variable"); - SWIG_PYTHON_THREAD_END_BLOCK; - return 1; + if (res == 1 && !PyErr_Occurred()) { + PyErr_SetString(PyExc_NameError,"Unknown C global variable"); + } + return res; } SWIGINTERN PyTypeObject* diff --git a/SWIG/Lib/python/pyrun.swg b/SWIG/Lib/python/pyrun.swg index 84b260f58..a01b20aa5 100644 --- a/SWIG/Lib/python/pyrun.swg +++ b/SWIG/Lib/python/pyrun.swg @@ -44,6 +44,10 @@ #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) {SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(SWIG_Python_ErrorType(code), msg); SWIG_PYTHON_THREAD_END_BLOCK; } +#define SWIG_SetErrorObj(type, obj) {SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(type, obj); SWIG_PYTHON_THREAD_END_BLOCK; } +#define SWIG_SetErrorMsg(type, msg) {SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(type, msg); SWIG_PYTHON_THREAD_END_BLOCK; } + + #define SWIG_fail goto fail /* diff --git a/SWIG/Lib/python/pythreads.swg b/SWIG/Lib/python/pythreads.swg index f1dba7946..a7552f1fe 100644 --- a/SWIG/Lib/python/pythreads.swg +++ b/SWIG/Lib/python/pythreads.swg @@ -10,24 +10,24 @@ # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ -# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# ifndef SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; - void begin() { if (!status) { state = PyGILState_Ensure(); status = true;} } public: void end() { if (status) { PyGILState_Release(state); status = false;} } - SWIG_Python_Thread_Block() : status(false) { begin(); } + SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; - void begin() { if (!status) { status = true; save = PyEval_SaveThread(); } } public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} - SWIG_Python_Thread_Allow() : status(false) { begin(); } + SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block diff --git a/SWIG/Source/Modules/python.cxx b/SWIG/Source/Modules/python.cxx index 336d963b6..82d67fce5 100644 --- a/SWIG/Source/Modules/python.cxx +++ b/SWIG/Source/Modules/python.cxx @@ -102,10 +102,7 @@ public: "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", - " SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n", - " PyErr_SetString(PyExc_RuntimeError,", - " \"accessing abstract class or protected constructor\"); \n", - " SWIG_PYTHON_THREAD_END_BLOCK;\n", + " SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing abstract class or protected constructor\"); \n", " SWIG_fail;\n", "}\n", NIL); director_multiple_inheritance = 1; @@ -1214,9 +1211,7 @@ public: Printf(f->code,"Py_INCREF(Py_NotImplemented);\n"); Printf(f->code,"return Py_NotImplemented;\n"); } else { - Printf(f->code,"SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n"); - Printf(f->code,"PyErr_SetString(PyExc_NotImplementedError,\"No matching function for overloaded '%s'\");\n", symname); - Printf(f->code,"SWIG_PYTHON_THREAD_END_BLOCK;\n"); + Printf(f->code,"SWIG_SetErrorMsg(PyExc_NotImplementedError,\"No matching function for overloaded '%s'\");\n", symname); Printf(f->code,"return NULL;\n"); } Printv(f->code,"}\n",NIL); @@ -1517,9 +1512,7 @@ public: Printf(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n"); if (dirprot_mode() && !is_public(n)) { Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name); - Printf(f->code,"SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n"); - Printf(f->code, "PyErr_SetString(PyExc_RuntimeError,\"accessing protected member %s\");\n", name); - Printf(f->code,"SWIG_PYTHON_THREAD_END_BLOCK;\n"); + Printf(f->code, "SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing protected member %s\");\n", name); Printf(f->code, "SWIG_fail;\n"); Printf(f->code, "}\n"); } @@ -1541,7 +1534,6 @@ public: /* Emit the function call */ if (director_method) { - if (allow_thread) thread_end_block(n, f); Printf(f->code, "try {\n"); Printf(f->code, " Swig::UnknownExceptionHandler dh;\n"); } else { @@ -1563,8 +1555,6 @@ public: Printf(f->code, "}\n"); } } - - /* This part below still needs cleanup */