Firstly, do NOT directly use types.CodeType
and use pyobject.Code
instead, as constructing types.CodeType
is too complex and not compatible across multiple Python versions.
The pyobject library, which can be installed via pip install pyobject
, provides a high-level wrapper for code objects.
According to devguide.python.org, Python 3.11 introduced _co_code_adaptive
attribute for code objects: devguide.python.org/internals/interpreter
E:\>py311
Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pyobject import Code
>>> import random
>>> def f(a):return a+1
...
>>> c=Code(f.__code__)
>>> new_co_code = bytes([random.randint(0, 255) for _ in range(24)])
>>> new_c=c.copy()
>>> new_c.co_code=new_co_code
>>> new_c._code.co_code
b'2R\xaf\x19X\xd1\x00\xa1}P\x00M2\xf5z\xed\x00\x00\xab\xbf\x00\x00\x00\x00'
>>> new_c._code._co_code_adaptive
b'2R\xaf\x19X\xd1\xdb\xa1}P\xc3M2\xf5\x06\xed%\xeb\xab\xbf\x18\x0f*\xff'
>>>
The inputted co_code
attribute is stored in _co_code_adaptive
, while the decoded bytecode is stored in co_code
.
Note: I'm the original developer of pyobject
.