-
-
Notifications
You must be signed in to change notification settings - Fork 34.1k
Description
Bug report
Bug description:
There are 3 callers of _PyFrame_GetFrameObject which explicitly clear error when it returns NULL.
take_ownershipLines 74 to 79 in b67a64d
PyFrameObject *back = _PyFrame_GetFrameObject(prev); if (back == NULL) { /* Memory error here. */ assert(PyErr_ExceptionMatches(PyExc_MemoryError)); /* Nothing we can do about it */ PyErr_Clear(); PyEval_GetFrameLines 2562 to 2564 in b67a64d
PyFrameObject *f = _PyFrame_GetFrameObject(frame); if (f == NULL) { PyErr_Clear(); PyThreadState_GetFrameLines 2101 to 2103 in b67a64d
PyFrameObject *frame = _PyFrame_GetFrameObject(f); if (frame == NULL) { PyErr_Clear();
PyEval_GetFrame and PyThreadState_GetFrame docs say that NULL is returned when "no frame is currently executing", and doesn't say anything about any error (probably as they explicitly clear it?).
I wonder whether PyFrame_GetBack also would want to clear error
Lines 2407 to 2409 in b67a64d
| if (prev) { | |
| back = _PyFrame_GetFrameObject(prev); | |
| } |
PyFrame_GetBack's documentation doesn't say anything about MemoryError which can be set by its internal API calls https://docs.python.org/3.15/c-api/frame.html#c.PyFrame_GetBack
The rest of the _PyFrame_GetFrameObject callers that don't clear error including PyFrame_GetBack are
_PyEval_ExceptionGroupMatch_PyEval_EvalFrameDefault(error label)_gen_getframesys__getframe_impl_PyThread_CurrentFrames_Py_call_instrumentation_line_PyFrame_GetLocalsPyEval_GetLocals— Public C API (deprecated), no NULL checkPyFrame_GetBack— Public C API, no NULL check
And PyEval_GetLocals and PyFrame_GetBack are public C APIs that don't check for NULL and don't clear the error. I guess the internals are ok to propagate the errors?
Can someone explain whether PyFrame_GetBack not clearing error on null is ok/intended or it's a discrepancy/bug?
I would prefer PyFrame_GetBack to not propagate an error given that its documentation doesn't say anything about MemoryError.
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response