@@ -876,7 +876,7 @@ trace_init(void)
876876
877877
878878static PyObject *
879- call_trampoline (PyObject * callback ,
879+ call_trampoline (PyThreadState * tstate , PyObject * callback ,
880880 PyFrameObject * frame , int what , PyObject * arg )
881881{
882882 if (PyFrame_FastToLocalsWithError (frame ) < 0 ) {
@@ -889,7 +889,7 @@ call_trampoline(PyObject* callback,
889889 stack [2 ] = (arg != NULL ) ? arg : Py_None ;
890890
891891 /* call the Python-level function */
892- PyObject * result = _PyObject_FastCall ( callback , stack , 3 );
892+ PyObject * result = _PyObject_FastCallTstate ( tstate , callback , stack , 3 );
893893
894894 PyFrame_LocalsToFast (frame , 1 );
895895 if (result == NULL ) {
@@ -903,15 +903,17 @@ static int
903903profile_trampoline (PyObject * self , PyFrameObject * frame ,
904904 int what , PyObject * arg )
905905{
906- PyObject * result ;
907-
908- if (arg == NULL )
906+ if (arg == NULL ) {
909907 arg = Py_None ;
910- result = call_trampoline (self , frame , what , arg );
908+ }
909+
910+ PyThreadState * tstate = _PyThreadState_GET ();
911+ PyObject * result = call_trampoline (tstate , self , frame , what , arg );
911912 if (result == NULL ) {
912- PyEval_SetProfile ( NULL , NULL );
913+ _PyEval_SetProfile ( tstate , NULL , NULL );
913914 return -1 ;
914915 }
916+
915917 Py_DECREF (result );
916918 return 0 ;
917919}
@@ -921,20 +923,24 @@ trace_trampoline(PyObject *self, PyFrameObject *frame,
921923 int what , PyObject * arg )
922924{
923925 PyObject * callback ;
924- PyObject * result ;
925-
926- if (what == PyTrace_CALL )
926+ if (what == PyTrace_CALL ) {
927927 callback = self ;
928- else
928+ }
929+ else {
929930 callback = frame -> f_trace ;
930- if (callback == NULL )
931+ }
932+ if (callback == NULL ) {
931933 return 0 ;
932- result = call_trampoline (callback , frame , what , arg );
934+ }
935+
936+ PyThreadState * tstate = _PyThreadState_GET ();
937+ PyObject * result = call_trampoline (tstate , callback , frame , what , arg );
933938 if (result == NULL ) {
934- PyEval_SetTrace ( NULL , NULL );
939+ _PyEval_SetTrace ( tstate , NULL , NULL );
935940 Py_CLEAR (frame -> f_trace );
936941 return -1 ;
937942 }
943+
938944 if (result != Py_None ) {
939945 Py_XSETREF (frame -> f_trace , result );
940946 }
@@ -947,12 +953,21 @@ trace_trampoline(PyObject *self, PyFrameObject *frame,
947953static PyObject *
948954sys_settrace (PyObject * self , PyObject * args )
949955{
950- if (trace_init () == -1 )
956+ if (trace_init () == -1 ) {
951957 return NULL ;
952- if (args == Py_None )
953- PyEval_SetTrace (NULL , NULL );
954- else
955- PyEval_SetTrace (trace_trampoline , args );
958+ }
959+
960+ PyThreadState * tstate = _PyThreadState_GET ();
961+ if (args == Py_None ) {
962+ if (_PyEval_SetTrace (tstate , NULL , NULL ) < 0 ) {
963+ return NULL ;
964+ }
965+ }
966+ else {
967+ if (_PyEval_SetTrace (tstate , trace_trampoline , args ) < 0 ) {
968+ return NULL ;
969+ }
970+ }
956971 Py_RETURN_NONE ;
957972}
958973
@@ -987,12 +1002,21 @@ sys_gettrace_impl(PyObject *module)
9871002static PyObject *
9881003sys_setprofile (PyObject * self , PyObject * args )
9891004{
990- if (trace_init () == -1 )
1005+ if (trace_init () == -1 ) {
9911006 return NULL ;
992- if (args == Py_None )
993- PyEval_SetProfile (NULL , NULL );
994- else
995- PyEval_SetProfile (profile_trampoline , args );
1007+ }
1008+
1009+ PyThreadState * tstate = _PyThreadState_GET ();
1010+ if (args == Py_None ) {
1011+ if (_PyEval_SetProfile (tstate , NULL , NULL ) < 0 ) {
1012+ return NULL ;
1013+ }
1014+ }
1015+ else {
1016+ if (_PyEval_SetProfile (tstate , profile_trampoline , args ) < 0 ) {
1017+ return NULL ;
1018+ }
1019+ }
9961020 Py_RETURN_NONE ;
9971021}
9981022
0 commit comments