Blob Blame History Raw
From fa5d2f5bc7c8ffbc7f80971cd7e93085f77b61f2 Mon Sep 17 00:00:00 2001
From: Stefan Behnel <stefan_ml@behnel.de>
Date: Fri, 14 May 2021 19:39:58 +0200
Subject: [PATCH] Adapt tracing code to Py3.10 beta 1.

---
 Cython/Utility/Profile.c | 79 +++++++++++++++++++++++++---------------
 1 file changed, 49 insertions(+), 30 deletions(-)

diff --git a/Cython/Utility/Profile.c b/Cython/Utility/Profile.c
index 5f2de7e54b..3134aa0403 100644
--- a/Cython/Utility/Profile.c
+++ b/Cython/Utility/Profile.c
@@ -47,13 +47,32 @@
     #define CYTHON_FRAME_DEL(frame) Py_CLEAR(frame)
   #endif
 
-  #define __Pyx_TraceDeclarations                                     \
-  static PyCodeObject *$frame_code_cname = NULL;                      \
-  CYTHON_FRAME_MODIFIER PyFrameObject *$frame_cname = NULL;           \
-  int __Pyx_use_tracing = 0;
+  #define __Pyx_TraceDeclarations                                         \
+      static PyCodeObject *$frame_code_cname = NULL;                      \
+      CYTHON_FRAME_MODIFIER PyFrameObject *$frame_cname = NULL;           \
+      int __Pyx_use_tracing = 0;
 
-  #define __Pyx_TraceFrameInit(codeobj)                               \
-  if (codeobj) $frame_code_cname = (PyCodeObject*) codeobj;
+  #define __Pyx_TraceFrameInit(codeobj)                                   \
+      if (codeobj) $frame_code_cname = (PyCodeObject*) codeobj;
+
+#if PY_VERSION_HEX >= 0x030a00b1
+  #define __Pyx_IsTracing(tstate, check_tracing, check_funcs) \
+     (unlikely(tstate->cframe->use_tracing) && \
+         (!(check_tracing) || !tstate->tracing) && \
+         (!(check_funcs) || tstate->c_profilefunc || (CYTHON_TRACE && tstate->c_tracefunc)))
+
+  #define __Pyx_SetTracing(tstate, enable) \
+      (tstate)->cframe->use_tracing = (enable)
+
+#else
+  #define __Pyx_IsTracing(tstate, check_tracing, check_funcs) \
+     (unlikely(tstate->use_tracing) && \
+         (!(check_tracing) || !tstate->tracing) && \
+         (!(check_funcs) || tstate->c_profilefunc || (CYTHON_TRACE && tstate->c_tracefunc)))
+
+  #define __Pyx_SetTracing(tstate, enable) \
+      (tstate)->use_tracing = (enable)
+#endif
 
   #ifdef WITH_THREAD
   #define __Pyx_TraceCall(funcname, srcfile, firstlineno, nogil, goto_error)             \
@@ -62,8 +81,7 @@
           PyThreadState *tstate;                                                         \
           PyGILState_STATE state = PyGILState_Ensure();                                  \
           tstate = __Pyx_PyThreadState_Current;                                          \
-          if (unlikely(tstate->use_tracing) && !tstate->tracing &&                       \
-                  (tstate->c_profilefunc || (CYTHON_TRACE && tstate->c_tracefunc))) {    \
+          if (__Pyx_IsTracing(tstate, 1, 1)) {                                           \
               __Pyx_use_tracing = __Pyx_TraceSetupAndCall(&$frame_code_cname, &$frame_cname, tstate, funcname, srcfile, firstlineno);  \
           }                                                                              \
           PyGILState_Release(state);                                                     \
@@ -71,8 +89,7 @@
       }                                                                                  \
   } else {                                                                               \
       PyThreadState* tstate = PyThreadState_GET();                                       \
-      if (unlikely(tstate->use_tracing) && !tstate->tracing &&                           \
-              (tstate->c_profilefunc || (CYTHON_TRACE && tstate->c_tracefunc))) {        \
+      if (__Pyx_IsTracing(tstate, 1, 1)) {                                               \
           __Pyx_use_tracing = __Pyx_TraceSetupAndCall(&$frame_code_cname, &$frame_cname, tstate, funcname, srcfile, firstlineno);  \
           if (unlikely(__Pyx_use_tracing < 0)) goto_error;                               \
       }                                                                                  \
@@ -80,8 +97,7 @@
   #else
   #define __Pyx_TraceCall(funcname, srcfile, firstlineno, nogil, goto_error)             \
   {   PyThreadState* tstate = PyThreadState_GET();                                       \
-      if (unlikely(tstate->use_tracing) && !tstate->tracing &&                           \
-              (tstate->c_profilefunc || (CYTHON_TRACE && tstate->c_tracefunc))) {        \
+      if (__Pyx_IsTracing(tstate, 1, 1)) {                                               \
           __Pyx_use_tracing = __Pyx_TraceSetupAndCall(&$frame_code_cname, &$frame_cname, tstate, funcname, srcfile, firstlineno);  \
           if (unlikely(__Pyx_use_tracing < 0)) goto_error;                               \
       }                                                                                  \
@@ -91,10 +107,9 @@
   #define __Pyx_TraceException()                                                           \
   if (likely(!__Pyx_use_tracing)); else {                                                  \
       PyThreadState* tstate = __Pyx_PyThreadState_Current;                                 \
-      if (tstate->use_tracing &&                                                           \
-              (tstate->c_profilefunc || (CYTHON_TRACE && tstate->c_tracefunc))) {          \
+      if (__Pyx_IsTracing(tstate, 0, 1)) {                                                 \
           tstate->tracing++;                                                               \
-          tstate->use_tracing = 0;                                                         \
+          __Pyx_SetTracing(tstate, 0);                                                     \
           PyObject *exc_info = __Pyx_GetExceptionTuple(tstate);                            \
           if (exc_info) {                                                                  \
               if (CYTHON_TRACE && tstate->c_tracefunc)                                     \
@@ -104,7 +119,7 @@
                   tstate->c_profileobj, $frame_cname, PyTrace_EXCEPTION, exc_info);        \
               Py_DECREF(exc_info);                                                         \
           }                                                                                \
-          tstate->use_tracing = 1;                                                         \
+          __Pyx_SetTracing(tstate, 1);                                                     \
           tstate->tracing--;                                                               \
       }                                                                                    \
   }
@@ -113,13 +128,13 @@
       PyObject *type, *value, *traceback;
       __Pyx_ErrFetchInState(tstate, &type, &value, &traceback);
       tstate->tracing++;
-      tstate->use_tracing = 0;
+      __Pyx_SetTracing(tstate, 0);
       if (CYTHON_TRACE && tstate->c_tracefunc)
           tstate->c_tracefunc(tstate->c_traceobj, frame, PyTrace_RETURN, result);
       if (tstate->c_profilefunc)
           tstate->c_profilefunc(tstate->c_profileobj, frame, PyTrace_RETURN, result);
       CYTHON_FRAME_DEL(frame);
-      tstate->use_tracing = 1;
+      __Pyx_SetTracing(tstate, 1);
       tstate->tracing--;
       __Pyx_ErrRestoreInState(tstate, type, value, traceback);
   }
@@ -132,14 +147,14 @@
               PyThreadState *tstate;                                                      \
               PyGILState_STATE state = PyGILState_Ensure();                               \
               tstate = __Pyx_PyThreadState_Current;                                       \
-              if (tstate->use_tracing) {                                                  \
+              if (__Pyx_IsTracing(tstate, 0, 0)) {                                        \
                   __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result);  \
               }                                                                           \
               PyGILState_Release(state);                                                  \
           }                                                                               \
       } else {                                                                            \
           PyThreadState* tstate = __Pyx_PyThreadState_Current;                            \
-          if (tstate->use_tracing) {                                                      \
+          if (__Pyx_IsTracing(tstate, 0, 0)) {                                            \
               __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result);      \
           }                                                                               \
       }                                                                                   \
@@ -148,7 +163,7 @@
   #define __Pyx_TraceReturn(result, nogil)                                                \
   if (likely(!__Pyx_use_tracing)); else {                                                 \
       PyThreadState* tstate = __Pyx_PyThreadState_Current;                                \
-      if (tstate->use_tracing) {                                                          \
+      if (__Pyx_IsTracing(tstate, 0, 0)) {                                                \
           __Pyx_call_return_trace_func(tstate, $frame_cname, (PyObject*)result);          \
       }                                                                                   \
   }
@@ -176,9 +191,11 @@
       __Pyx_ErrFetchInState(tstate, &type, &value, &traceback);
       __Pyx_PyFrame_SetLineNumber(frame, lineno);
       tstate->tracing++;
-      tstate->use_tracing = 0;
+      __Pyx_SetTracing(tstate, 0);
+
       ret = tstate->c_tracefunc(tstate->c_traceobj, frame, PyTrace_LINE, NULL);
-      tstate->use_tracing = 1;
+
+      __Pyx_SetTracing(tstate, 1);
       tstate->tracing--;
       if (likely(!ret)) {
           __Pyx_ErrRestoreInState(tstate, type, value, traceback);
@@ -199,7 +216,7 @@
               PyThreadState *tstate;                                                       \
               PyGILState_STATE state = PyGILState_Ensure();                                \
               tstate = __Pyx_PyThreadState_Current;                                        \
-              if (unlikely(tstate->use_tracing && tstate->c_tracefunc && $frame_cname->f_trace)) { \
+              if (__Pyx_IsTracing(tstate, 0, 0) && tstate->c_tracefunc && $frame_cname->f_trace) { \
                   ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno);          \
               }                                                                            \
               PyGILState_Release(state);                                                   \
@@ -207,7 +224,7 @@
           }                                                                                \
       } else {                                                                             \
           PyThreadState* tstate = __Pyx_PyThreadState_Current;                             \
-          if (unlikely(tstate->use_tracing && tstate->c_tracefunc && $frame_cname->f_trace)) { \
+          if (__Pyx_IsTracing(tstate, 0, 0) && tstate->c_tracefunc && $frame_cname->f_trace) { \
               int ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno);          \
               if (unlikely(ret)) goto_error;                                               \
           }                                                                                \
@@ -217,7 +234,7 @@
   #define __Pyx_TraceLine(lineno, nogil, goto_error)                                       \
   if (likely(!__Pyx_use_tracing)); else {                                                  \
       PyThreadState* tstate = __Pyx_PyThreadState_Current;                                 \
-      if (unlikely(tstate->use_tracing && tstate->c_tracefunc && $frame_cname->f_trace)) { \
+      if (__Pyx_IsTracing(tstate, 0, 0) && tstate->c_tracefunc && $frame_cname->f_trace) { \
           int ret = __Pyx_call_line_trace_func(tstate, $frame_cname, lineno);              \
           if (unlikely(ret)) goto_error;                                                   \
       }                                                                                    \
@@ -263,19 +280,21 @@ static int __Pyx_TraceSetupAndCall(PyCodeObject** code,
         (*frame)->f_tstate = tstate;
 #endif
     }
-      __Pyx_PyFrame_SetLineNumber(*frame, firstlineno);
+    __Pyx_PyFrame_SetLineNumber(*frame, firstlineno);
+
     retval = 1;
     tstate->tracing++;
-    tstate->use_tracing = 0;
+    __Pyx_SetTracing(tstate, 0);
     __Pyx_ErrFetchInState(tstate, &type, &value, &traceback);
+
     #if CYTHON_TRACE
     if (tstate->c_tracefunc)
         retval = tstate->c_tracefunc(tstate->c_traceobj, *frame, PyTrace_CALL, NULL) == 0;
     if (retval && tstate->c_profilefunc)
     #endif
         retval = tstate->c_profilefunc(tstate->c_profileobj, *frame, PyTrace_CALL, NULL) == 0;
-    tstate->use_tracing = (tstate->c_profilefunc ||
-                           (CYTHON_TRACE && tstate->c_tracefunc));
+
+    __Pyx_SetTracing(tstate, (tstate->c_profilefunc || (CYTHON_TRACE && tstate->c_tracefunc)));
     tstate->tracing--;
     if (retval) {
         __Pyx_ErrRestoreInState(tstate, type, value, traceback);