@@ -233,6 +233,13 @@ static PyThreadState *tcl_tstate = NULL;
233233 { PyThreadState *tstate = PyEval_SaveThread(); \
234234 if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate; }
235235
236+ #define ENTER_PYTHON_OVERLAP \
237+ { PyThreadState *tstate = tcl_tstate; tcl_tstate = NULL; PyEval_RestoreThread((tstate)); }
238+
239+ #define LEAVE_PYTHON_OVERLAP \
240+ { PyThreadState *tstate = PyEval_SaveThread(); tcl_tstate = tstate; }
241+
242+
236243#define CHECK_TCL_APPARTMENT \
237244 if (((TkappObject *)self)->threaded && \
238245 ((TkappObject *)self)->thread_id != Tcl_GetCurrentThread()) { \
@@ -249,6 +256,8 @@ static PyThreadState *tcl_tstate = NULL;
249256#define LEAVE_OVERLAP_TCL
250257#define ENTER_PYTHON
251258#define LEAVE_PYTHON
259+ #define ENTER_PYTHON_OVERLAP
260+ #define LEAVE_PYTHON_OVERLAP
252261#define CHECK_TCL_APPARTMENT
253262
254263#endif
@@ -1551,17 +1560,17 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
15511560 Tcl_Obj * * objv ;
15521561 int objc ;
15531562 int i ;
1554- ENTER_PYTHON
1563+ ENTER_PYTHON_OVERLAP
15551564 objv = Tkapp_CallArgs (e -> args , objStore , & objc );
15561565 if (!objv ) {
15571566 PyErr_Fetch (e -> exc_type , e -> exc_value , e -> exc_tb );
15581567 * (e -> res ) = NULL ;
15591568 }
1560- LEAVE_PYTHON
1569+ LEAVE_PYTHON_OVERLAP
15611570 if (!objv )
15621571 goto done ;
15631572 i = Tcl_EvalObjv (e -> self -> interp , objc , objv , e -> flags );
1564- ENTER_PYTHON
1573+ ENTER_PYTHON_OVERLAP
15651574 if (i == TCL_ERROR ) {
15661575 * (e -> res ) = NULL ;
15671576 * (e -> exc_type ) = NULL ;
@@ -1573,7 +1582,7 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
15731582 else {
15741583 * (e -> res ) = Tkapp_CallResult (e -> self );
15751584 }
1576- LEAVE_PYTHON
1585+ LEAVE_PYTHON_OVERLAP
15771586
15781587 Tkapp_CallDeallocArgs (objv , objStore , objc );
15791588done :
@@ -1669,7 +1678,11 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
16691678 else
16701679 res = Tkapp_CallResult (self );
16711680
1681+ LEAVE_OVERLAP
1682+
16721683 Tkapp_CallDeallocArgs (objv , objStore , objc );
1684+
1685+ ENTER_OVERLAP
16731686
16741687 }
16751688 LEAVE_OVERLAP_TCL
@@ -2492,15 +2505,18 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
24922505 if (res == NULL )
24932506 return PythonCmd_Error (interp );
24942507
2508+ ENTER_TCL
2509+ ENTER_OVERLAP
24952510 obj_res = AsObj (res );
2511+ if (obj_res ) {
2512+ Tcl_SetObjResult (interp , obj_res );
2513+ rv = TCL_OK ;
2514+ }
2515+ LEAVE_OVERLAP_TCL
24962516 if (obj_res == NULL) {
24972517 Py_DECREF (res );
24982518 return PythonCmd_Error (interp );
24992519 }
2500- else {
2501- Tcl_SetObjResult (interp , obj_res );
2502- rv = TCL_OK ;
2503- }
25042520
25052521 Py_DECREF (res );
25062522
0 commit comments