Bytecode

Latest version: v0.16.1

Safety actively analyzes 723158 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 2 of 4

0.14.0

--------------------------

New features:

- Removed the peephole optimizer PR 107

Basically changes in Python 3.11 made it hard to port and the maintenance cost
exceeded the perceived use. It could be re-added if there is a demand for it.

- Add support for Python 3.11 PR 107

Support for Python 3.11, comes with a number of changes reflecting changes in
CPython bytecode itself:

- support for the exception table in ``ConcreteBytecode``
- support for pseudo-instruction ``TryBegin`` and ``TryEnd`` describing the
exception table in ``Bytecode`` and ``ControlflowGraph``
- new keyword arguments in conversion method related to computations required
for the exception table
- handling of CACHE opcode at the ``ConcreteBytecode`` level
- handling of the ability of ``LOAD_GLOBAL`` to push NULL (the argument is
now a ``tuple[bool, str]``)
- support for end_lineno and column offsets in instructions
- support for ``co_qualname`` (as ``qualname`` on bytecode objects)

and a number of internal changes related to changes in the internal bytecode
representation.

- Add type annotations and make types stricter PR 105
In particular, ConcreteInstr does not inherit from Instr anymore and one
cannot use ConcreteInstr in Bytecode object. This is saner than before.

Bugfixes:

- Removed ``EXC_MATCH`` from the ``Compare`` enumeration starting with Python
3.9. The new ``JUMP_IF_NOT_EXC_MATCH`` opcode should be used instead.

- Removed ``IN``, ``NOT_IN``, ``IS``, ``NOT_IS`` from the ``Compare``
enumeration starting with Python 3.9. The new ``CONTAINS_OP`` and ``IS_OP``
opcodes should be used instead.

- Add proper pre and post stack effects to all opcodes (up to Python 3.11)
PR 106 107

Maintenance:

- Make the install process PEP517 compliant PR 97
- Drop support for Python 3.6 and 3.7 PR 100

0.13.0

--------------------------

New features:

- Add support for Python 3.10 new encoding of line number. This support is
minimal in the sense that we still systematically assign a line number
while the new format allow bytecode with absolutely no line number. PR 72


Bugfixes:

- Fix handling of RERAISE (introduced in 3.9) when creating a ControlFlowGraph,
previously it was not considered final. PR 72

- Fix line table assembly in Python 3.10. PR 85

0.12.0

--------------------------

New features:

- All calculations of stacksize now check for stack underflow to avoid segfault at
runtime PR 69

Bugfixes:

- Fix recursion limitations when compiling bytecode with numerous basic
blocks. PR 57
- Fix handling of line offsets. Issue 67, PR 71

API changes:

- Forbid an :class:`Instr` to hold an EXTENDED_ARG op_code PR 65
- Forbid the use of :class:`ConcreteInstr` in :class:`Bytecode` and
:class:`ControlFlowGraph` PR 65
This is motivated by the extra complexity that handling possible EXTENDED_ARG
instruction in those representation would bring (stack computation, etc)
- Always remove EXTENDED_ARG when converting :class:`ConcreteBytecode` to
:class:`Bytecode` PR 65
This is equivalent to say that the :class:`ConcreteBytecode` converted to
:class:`Bytecode` was generated by :meth:`ConcreteBytecode.from_code`
with extended_args=False
- :class:`Instr` now has a new method :meth:`Instr.pre_and_post_stack_effect`
for checking the prerequisite stack size of an operation PR 69
- :meth:`_compute_stack_size` now uses :meth:`Instr.pre_and_post_stack_effect`
to compute the stack size to reject code that will lead to runtime segfault
caused by stack underflow PR 69

0.11.0

--------------------------

New features:

- The :func:`infer_flags` can now be used to forcibly mark a function as
asynchronous or not.

Bugfixes:

- Fix a design flaw in the flag inference mechanism that could very easily
lead to invalid flags configuration PR 56

0.10.0

--------------------------

New features:

- Slices and copy of :class:`Bytecode`, :class:`ConcreteBytecode` and
:class:`BasicBlock` are now of the same type as the original container. PR 52
- :class:`Bytecode`, :class:`ConcreteBytecode`, :class:`BasicBlock` and
:class:`ControlFlowGraph` have a new :meth:`legalize` method validating
their content and removing SetLineno. PR 52
- Modify the implementation of :code:`const_key` to avoid manual
synchronizations with :code:`_PyCode_ConstantKey` in CPython codebase and
allow the use of arbitrary Python objects as constants of nested code
objects. 54

API changes:

- Add :class:`Compare` enum to public API. PR 53

0.9.0

-------------------------

New features:

- Add support for released version of Python 3.8 and update documentation.

Page 2 of 4

© 2025 Safety CLI Cybersecurity Inc. All Rights Reserved.