Commit e711be3
authored
[mypyc] Fix undefined attribute in nested coroutines (#20654)
When creating a callable class for a generator, mypyc creates an
attribute in its env class that points at the compiled function so it
can be called recursively
https://github.com/python/mypy/blob/544b97ec296e16e4c96a42a1b81d5dcd841cf232/mypyc/irbuild/env_class.py#L263
The attribute is prefixed by `__mypyc_generator_attribute__` in case the
function name clashes with an attribute generated by mypyc internally.
However, in other places the attribute is currently not prefixed for
async functions which leads to mypyc generating both the prefixed and
unprefixed versions, eg. for a function `wrapper_async` the env class
will have both `_wrapper_async` and
`___mypyc_generator_attribute__wrapper_async` attributes with the second
one potentially undefined. This ends up in a runtime crash when another
nested function is called from a nested coroutine.
The issue is fixed by prefixing the attribute for coroutines in addition
to generators so that only the prefixed attribute is in the env class.1 parent 544b97e commit e711be3
3 files changed
Lines changed: 53 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
657 | 657 | | |
658 | 658 | | |
659 | 659 | | |
660 | | - | |
| 660 | + | |
661 | 661 | | |
662 | 662 | | |
663 | 663 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
200 | 200 | | |
201 | 201 | | |
202 | 202 | | |
203 | | - | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
204 | 208 | | |
205 | 209 | | |
206 | 210 | | |
| |||
240 | 244 | | |
241 | 245 | | |
242 | 246 | | |
243 | | - | |
| 247 | + | |
244 | 248 | | |
245 | 249 | | |
246 | 250 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1799 | 1799 | | |
1800 | 1800 | | |
1801 | 1801 | | |
| 1802 | + | |
| 1803 | + | |
| 1804 | + | |
| 1805 | + | |
| 1806 | + | |
| 1807 | + | |
| 1808 | + | |
| 1809 | + | |
| 1810 | + | |
| 1811 | + | |
| 1812 | + | |
| 1813 | + | |
| 1814 | + | |
| 1815 | + | |
| 1816 | + | |
| 1817 | + | |
| 1818 | + | |
| 1819 | + | |
| 1820 | + | |
| 1821 | + | |
| 1822 | + | |
| 1823 | + | |
| 1824 | + | |
| 1825 | + | |
| 1826 | + | |
| 1827 | + | |
| 1828 | + | |
| 1829 | + | |
| 1830 | + | |
| 1831 | + | |
| 1832 | + | |
| 1833 | + | |
| 1834 | + | |
| 1835 | + | |
| 1836 | + | |
| 1837 | + | |
| 1838 | + | |
| 1839 | + | |
| 1840 | + | |
| 1841 | + | |
| 1842 | + | |
| 1843 | + | |
| 1844 | + | |
| 1845 | + | |
| 1846 | + | |
| 1847 | + | |
0 commit comments