You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[C API] Move the PyCodeObject structure to the internal C API (make the structure opaque) #91397
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=Nonecreated_at=<Date2022-04-06.13:56:37.081>labels= ['expert-C-API', '3.11']
title='[C API] Move the PyCodeObject structure to the internal C API (make the structure opaque)'updated_at=<Date2022-04-06.13:56:37.081>user='https://github.com/vstinner'
The PyCodeObject structure should be made opaque in the public C API and only accessed with function calls.
In Python 3.11, the PyFrameObject structure was made opaque (bpo-46836) and multiple getters were added (bpo-40421). The idea is similar, but it might be too late to do that in Python 3.11 (beta1 feature freeze is close).
---
By the way, it was proposed multiple times on python-dev to mark the PyCode_New() function as "unstable" since its API changed often. PEP-670 "Python Positional-Only Parameters" caused a lot of troubles in Cython when it added a new parameter to PyCode_New(). The change was reverted: instead, a new PyCode_NewWithPosOnlyArgs() function was added.
Also, co_code has been gone since 2bde682. Which is 3.11a7 and up only. For that you'd need the internal _PyCode_GetCode (Huh, I just realised we should probably expose that in CPython's API).
It would be nice to add a public C API getter function, something like PyCode_GetCode() which would return a strong reference to a bytes object.
Activity
vstinner commentedon Apr 6, 2022
The PyCodeObject structure is documented at:
https://docs.python.org/dev/c-api/code.html
The structured evolved a lot in Python 3.11 to optimize Python/ceval.c performance:
https://peps.python.org/pep-0659/
New members:
The PyCodeObject structure should be made opaque in the public C API and only accessed with function calls.
In Python 3.11, the PyFrameObject structure was made opaque (bpo-46836) and multiple getters were added (bpo-40421). The idea is similar, but it might be too late to do that in Python 3.11 (beta1 feature freeze is close).
---
By the way, it was proposed multiple times on python-dev to mark the PyCode_New() function as "unstable" since its API changed often. PEP-670 "Python Positional-Only Parameters" caused a lot of troubles in Cython when it added a new parameter to PyCode_New(). The change was reverted: instead, a new PyCode_NewWithPosOnlyArgs() function was added.
On Python 3.11a1 and newer, Cython uses the code.replace() method (added to Python 3.8) to build new code objects. Otherwise, it just calls directly PyCode_New().
https://docs.python.org/dev/library/types.html#types.CodeType.replace
vstinner commentedon May 2, 2022
See the semi-stable API:
vstinner commentedon May 2, 2022
On coveragepy/coveragepy#1353 (comment), @Fidget-Spinner wrote:
It would be nice to add a public C API getter function, something like PyCode_GetCode() which would return a strong reference to a bytes object.
vstinner commentedon May 2, 2022
Ah, @Fidget-Spinner opened #92154 for that!
vstinner commentedon Jun 7, 2022
Cython issue related to PyCodeObject structure size in Python 3.11: cython/cython#4827