Skip to content

[mypyc] Clear coroutine env on coroutine completion - #21734

Merged
p-sawicki merged 6 commits into
python:masterfrom
p-sawicki:clear-coroutine-env-on-completion
Jul 17, 2026
Merged

[mypyc] Clear coroutine env on coroutine completion#21734
p-sawicki merged 6 commits into
python:masterfrom
p-sawicki:clear-coroutine-env-on-completion

Conversation

@p-sawicki

@p-sawicki p-sawicki commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

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.

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-sawicki
p-sawicki merged commit 2601fb7 into python:master Jul 17, 2026
18 checks passed
@p-sawicki
p-sawicki deleted the clear-coroutine-env-on-completion branch July 17, 2026 16:17
hauntsaninja pushed a commit that referenced this pull request Aug 15, 2026
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.
MateoGreil pushed a commit to MateoGreil/python-comwatt-client that referenced this pull request Aug 15, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [mypy](https://github.com/python/mypy) ([changelog](https://mypy.readthedocs.io/en/latest/changelog.html)) | `==2.3.0` → `==2.3.1` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/mypy/2.3.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/mypy/2.3.0/2.3.1?slim=true) |

---

### Release Notes

<details>
<summary>python/mypy (mypy)</summary>

### [`v2.3.1`](https://github.com/python/mypy/blob/HEAD/CHANGELOG.md#Mypy-231)

[Compare Source](python/mypy@v2.3.0...v2.3.1)

- Fix mypyc crash on double yielding Iterators (Daniël van Noord, PR [21826](python/mypy#21826))
- Fix mypyc `default_factory` for inherited dataclass (Daniël van Noord, PR [21785](python/mypy#21785))
- Clear mypyc coroutine env on coroutine completion (Piotr Sawicki, PR [21734](python/mypy#21734))
- Fix crash when unpacking return value from overload (Shantanu, PR [21830](python/mypy#21830))

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMC4zIiwidXBkYXRlZEluVmVyIjoiNDQuMzAuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Renovate Bot <renovate-bot@git.greil.fr>
Reviewed-on: https://git.greil.fr/mat/python-comwatt-client/pulls/54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants