Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork34.2k
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 inb67a64d
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 inb67a64d
PyFrameObject*f=_PyFrame_GetFrameObject(frame); if (f==NULL) { PyErr_Clear(); PyThreadState_GetFrameLines 2101 to 2103 inb67a64d
PyFrameObject*frame=_PyFrame_GetFrameObject(f); if (frame==NULL) { PyErr_Clear();
PyEval_GetFrame andPyThreadState_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 whetherPyFrame_GetBack also would want to clear error
Lines 2407 to 2409 inb67a64d
| if (prev) { | |
| back=_PyFrame_GetFrameObject(prev); | |
| } |
PyFrame_GetBack's documentation doesn't say anything aboutMemoryError which can be set by its internal API callshttps://docs.python.org/3.15/c-api/frame.html#c.PyFrame_GetBack
The rest of the_PyFrame_GetFrameObject callers that don't clear error includingPyFrame_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
AndPyEval_GetLocals andPyFrame_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 whetherPyFrame_GetBack not clearing error on null is ok/intended or it's a discrepancy/bug?
I would preferPyFrame_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