diff --git a/paddle/fluid/pybind/cpython_internals.c b/paddle/fluid/pybind/cpython_internals.c index 0e5329d6f1287d..af7ede116e4b23 100644 --- a/paddle/fluid/pybind/cpython_internals.c +++ b/paddle/fluid/pybind/cpython_internals.c @@ -109,7 +109,7 @@ static void Internal_clear_thread_frame(PyThreadState *tstate, tstate->datastack_top); tstate->c_recursion_remaining--; assert(frame->frame_obj == NULL || frame->frame_obj->f_frame == frame); - Internal_PyFrame_Clear(frame); // see _PyFrame_ClearExceptCode + Internal_PyFrame_ClearExceptCode(frame); Py_DECREF(frame->f_code); tstate->c_recursion_remaining++; Internal_PyThreadState_PopFrame(tstate, frame); @@ -125,7 +125,7 @@ static void Internal_clear_gen_frame(PyThreadState *tstate, gen->gi_exc_state.previous_item = NULL; tstate->c_recursion_remaining--; assert(frame->frame_obj == NULL || frame->frame_obj->f_frame == frame); - Internal_PyFrame_Clear(frame); // see _PyFrame_ClearExceptCode + Internal_PyFrame_ClearExceptCode(frame); tstate->c_recursion_remaining++; frame->previous = NULL; } @@ -584,7 +584,11 @@ static void Internal_take_ownership(PyFrameObject *f, } // Call on 3.11 _PyFrame_Clear is called on 3.12+ _PyFrame_ClearExceptCode +#if PY_VERSION_HEX >= 0x030c0000 +void Internal_PyFrame_ClearExceptCode(_PyInterpreterFrame *frame) { +#else void Internal_PyFrame_Clear(_PyInterpreterFrame *frame) { +#endif /* It is the responsibility of the owning generator/coroutine * to have cleared the enclosing generator, if any. */ assert(frame->owner != FRAME_OWNED_BY_GENERATOR || diff --git a/paddle/fluid/pybind/cpython_internals.h b/paddle/fluid/pybind/cpython_internals.h index 941279b88f8700..fe8330312dc9ef 100644 --- a/paddle/fluid/pybind/cpython_internals.h +++ b/paddle/fluid/pybind/cpython_internals.h @@ -43,6 +43,7 @@ void Internal_PyEvalFrameClearAndPop(PyThreadState *tstate, _PyInterpreterFrame *frame); _PyInterpreterFrame *Internal_PyThreadState_PushFrame(PyThreadState *tstate, size_t size); +void Internal_PyFrame_ClearExceptCode(_PyInterpreterFrame *frame); #endif #endif diff --git a/paddle/fluid/pybind/eval_frame.c b/paddle/fluid/pybind/eval_frame.c index 3e5b50211cdece..aa5a4c0022fcc8 100644 --- a/paddle/fluid/pybind/eval_frame.c +++ b/paddle/fluid/pybind/eval_frame.c @@ -366,6 +366,9 @@ static PyObject *_custom_eval_frame(PyThreadState *tstate, PyObject *result = PyObject_CallObject(callback, args); Py_DECREF(args); if (result == NULL) { +#if PY_VERSION_HEX >= 0x030C0000 + Internal_PyEvalFrameClearAndPop(tstate, frame); +#endif return NULL; } code = PyObject_GetAttrString(result, "code");