Skip to content

broken optimization in gen_close() #111107

Closed

Description

@iritkatriel

There is an optimization in gen_close which attempts to shortcut the case where a sub-generator is being closed, and it is wrapped in only one try block (which is presumed to be for the StopIteration so can be ignored).

However, there is a bug there where the exception depth is taken from frame->prev_instr[0].op.code, where it should be frame->prev_instr[0].op.arg.

At the moment this optimization is not doing anything because exception_handler_depth is never 1, it is either 118 (opcode of YIELD_VALUE) or 241 (opcode of INSTRUMENTED_YIELD_VALUE). If one of those opcodes will happen to be mapped to 1, then this code will have some impact but obviously not the intended one.

CC @markshannon

Activity

  1. iritkatriel commented on Oct 20, 2023

    @iritkatriel
    MemberAuthor

    If I try to fix the typo and use op.arg instead of op.code, some tests fail: #111069

    I think the return value is incorrect in some cases.

  2. iritkatriel commented on Oct 20, 2023

    @iritkatriel
    MemberAuthor

    The failure in testcontextlib is fixed by setting the frame state in case we return early:

             if (exception_handler_depth == 1) {
    +            gen->gi_frame_state = FRAME_COMPLETED;
                 Py_RETURN_NONE;
             }
    
    
  3. Eclips4 commented on Oct 20, 2023

    @Eclips4
    Member

    Probably related: #111058

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions