Skip to content

no sys.monitoring branches shown for async for #123076

Open
@jaltmayerpizzorno

Description

@jaltmayerpizzorno

Bug report

Bug description:

With the code from PR 122564, no branches are indicated for an async for. In the example below, both branches for the if also unexpectedly present (through co_locations) as "going out of scope":

import asyncio

async def g():
    yield 1
    yield 2

x = 0
async def fun():
    global x

    async for v in g():  # line 11
        if v > 0:
            x += v
    x += 3
    print(x)

asyncio.run(fun())

Results:

Disassembly of <code object fun at 0x103480870, file "/Users/juan/project/slipcover/ex11.py", line 8>:
   8           0       RETURN_GENERATOR
               2       POP_TOP
        L1:    4       RESUME                   0

  11           6       LOAD_GLOBAL              1 (g + NULL)
              16       CALL                     0
              24       GET_AITER
        L2:   26       GET_ANEXT
              28       LOAD_CONST               0 (None)
        L3:   30       SEND                     3 (to L6)
        L4:   34       YIELD_VALUE              1
        L5:   36       RESUME                   3
              38       JUMP_BACKWARD_NO_INTERRUPT 5 (to L3)
        L6:   40       END_SEND
        L7:   42       STORE_FAST               0 (v)

  12          44       LOAD_FAST                0 (v)
              46       LOAD_CONST               1 (0)
              48       COMPARE_OP             148 (bool(>))
        L8:   52       POP_JUMP_IF_TRUE         2 (to L9)
              56       JUMP_BACKWARD           17 (to L2)
        L9:   60       NOT_TAKEN

  13          62       LOAD_GLOBAL              2 (x)
              72       LOAD_FAST                0 (v)
              74       BINARY_OP               13 (+=)
              78       STORE_GLOBAL             1 (x)
              80       JUMP_BACKWARD           29 (to L2)

  11   L10:   84       CLEANUP_THROW
       L11:   86       JUMP_BACKWARD_NO_INTERRUPT 24 (to L6)
       L12:   88       END_ASYNC_FOR

  14          90       LOAD_GLOBAL              2 (x)
             100       LOAD_CONST               2 (3)
             102       BINARY_OP               13 (+=)
             106       STORE_GLOBAL             1 (x)

  15         108       LOAD_GLOBAL              5 (print + NULL)
             118       LOAD_GLOBAL              2 (x)
             128       CALL                     1
             136       POP_TOP
             138       RETURN_CONST             0 (None)

  --   L13:  140       CALL_INTRINSIC_1         3 (INTRINSIC_STOPITERATION_ERROR)
             142       RERAISE                  1
ExceptionTable:
  L1 to L2 -> L13 [0] lasti
  L2 to L4 -> L12 [1]
  L4 to L5 -> L10 [3]
  L5 to L7 -> L12 [1]
  L7 to L8 -> L13 [0] lasti
  L9 to L10 -> L13 [0] lasti
  L10 to L11 -> L12 [1]
  L12 to L13 -> L13 [0] lasti

'fun' branches:
    ex11.py 12:11-12:16 "v > 0" (fun@52) -> 12:11-12:16 "v > 0" (fun@58) [if/while -> out]
    ex11.py 12:11-12:16 "v > 0" (fun@52) -> 12:11-12:16 "v > 0" (fun@60) [if/while -> out]

@markshannon @nedbat

CPython versions tested on:

CPython main branch

Operating systems tested on:

macOS

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