[mypyc] Clear coroutine env on coroutine completion (#21734)
The `env_class` object associated with a mypyc coroutine is not
immediately cleared when the coroutine completes. This can significantly
increase memory usage, since the env class may hold references to
captured locals and values spilled across suspension points.
The objects are eventually collectible by the GC but the collection
might be delayed in cases where a nested coroutine is awaited, eg.
```python
async def allocate(size: int) -> None:
payload = bytearray(size)
async def nested() -> int:
return payload[-1]
assert await nested() == 0
```
With nesting mypyc creates env classes for both `allocate` and `nested`
that may reference each other and form a cycle.
To fix this, clear the `env_class` immediately after the coroutine
completes. This matches behavior of cpython, which clears frames of
completed coroutines immediately in the eval loop. P
Piotr Sawicki committed
2601fb7916742dc8a020bb4a010bad45f1fd6f4f
Parent: 67eecf0
Committed by GitHub <noreply@github.com>
on 7/17/2026, 4:17:02 PM