Skip to content

Inconsistencies in error propagation after calling _PyFrame_GetFrameObject #144693

@taegyunkim

Description

@taegyunkim

Bug report

Bug description:

There are 3 callers of _PyFrame_GetFrameObject which explicitly clear error when it returns NULL.

  1. take_ownership

    cpython/Python/frame.c

    Lines 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();
  2. PyEval_GetFrame

    cpython/Python/ceval.c

    Lines 2562 to 2564 in b67a64d

    PyFrameObject *f = _PyFrame_GetFrameObject(frame);
    if (f == NULL) {
    PyErr_Clear();
  3. PyThreadState_GetFrame

    cpython/Python/pystate.c

    Lines 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

cpython/Objects/frameobject.c

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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions