mirror of https://github.com/python/cpython
1964 lines
58 KiB
ReStructuredText
1964 lines
58 KiB
ReStructuredText
:mod:`dis` --- Disassembler for Python bytecode
|
|
===============================================
|
|
|
|
.. module:: dis
|
|
:synopsis: Disassembler for Python bytecode.
|
|
|
|
**Source code:** :source:`Lib/dis.py`
|
|
|
|
.. testsetup::
|
|
|
|
import dis
|
|
def myfunc(alist):
|
|
return len(alist)
|
|
|
|
--------------
|
|
|
|
The :mod:`dis` module supports the analysis of CPython :term:`bytecode` by
|
|
disassembling it. The CPython bytecode which this module takes as an input is
|
|
defined in the file :file:`Include/opcode.h` and used by the compiler and the
|
|
interpreter.
|
|
|
|
.. impl-detail::
|
|
|
|
Bytecode is an implementation detail of the CPython interpreter. No
|
|
guarantees are made that bytecode will not be added, removed, or changed
|
|
between versions of Python. Use of this module should not be considered to
|
|
work across Python VMs or Python releases.
|
|
|
|
.. versionchanged:: 3.6
|
|
Use 2 bytes for each instruction. Previously the number of bytes varied
|
|
by instruction.
|
|
|
|
.. versionchanged:: 3.10
|
|
The argument of jump, exception handling and loop instructions is now
|
|
the instruction offset rather than the byte offset.
|
|
|
|
.. versionchanged:: 3.11
|
|
Some instructions are accompanied by one or more inline cache entries,
|
|
which take the form of :opcode:`CACHE` instructions. These instructions
|
|
are hidden by default, but can be shown by passing ``show_caches=True`` to
|
|
any :mod:`dis` utility. Furthermore, the interpreter now adapts the
|
|
bytecode to specialize it for different runtime conditions. The
|
|
adaptive bytecode can be shown by passing ``adaptive=True``.
|
|
|
|
.. versionchanged:: 3.12
|
|
The argument of a jump is the offset of the target instruction relative
|
|
to the instruction that appears immediately after the jump instruction's
|
|
:opcode:`CACHE` entries.
|
|
|
|
As a consequence, the presence of the :opcode:`CACHE` instructions is
|
|
transparent for forward jumps but needs to be taken into account when
|
|
reasoning about backward jumps.
|
|
|
|
.. versionchanged:: 3.13
|
|
The output shows logical labels rather than instruction offsets
|
|
for jump targets and exception handlers. The ``-O`` command line
|
|
option and the ``show_offsets`` argument were added.
|
|
|
|
Example: Given the function :func:`!myfunc`::
|
|
|
|
def myfunc(alist):
|
|
return len(alist)
|
|
|
|
the following command can be used to display the disassembly of
|
|
:func:`!myfunc`:
|
|
|
|
.. doctest::
|
|
|
|
>>> dis.dis(myfunc)
|
|
2 RESUME 0
|
|
<BLANKLINE>
|
|
3 LOAD_GLOBAL 1 (len + NULL)
|
|
LOAD_FAST 0 (alist)
|
|
CALL 1
|
|
RETURN_VALUE
|
|
|
|
(The "2" is a line number).
|
|
|
|
.. _dis-cli:
|
|
|
|
Command-line interface
|
|
----------------------
|
|
|
|
The :mod:`dis` module can be invoked as a script from the command line:
|
|
|
|
.. code-block:: sh
|
|
|
|
python -m dis [-h] [-C] [-O] [infile]
|
|
|
|
The following options are accepted:
|
|
|
|
.. program:: dis
|
|
|
|
.. cmdoption:: -h, --help
|
|
|
|
Display usage and exit.
|
|
|
|
.. cmdoption:: -C, --show-caches
|
|
|
|
Show inline caches.
|
|
|
|
.. cmdoption:: -O, --show-offsets
|
|
|
|
Show offsets of instructions.
|
|
|
|
If :file:`infile` is specified, its disassembled code will be written to stdout.
|
|
Otherwise, disassembly is performed on compiled source code recieved from stdin.
|
|
|
|
Bytecode analysis
|
|
-----------------
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
The bytecode analysis API allows pieces of Python code to be wrapped in a
|
|
:class:`Bytecode` object that provides easy access to details of the compiled
|
|
code.
|
|
|
|
.. class:: Bytecode(x, *, first_line=None, current_offset=None,\
|
|
show_caches=False, adaptive=False, show_offsets=False)
|
|
|
|
Analyse the bytecode corresponding to a function, generator, asynchronous
|
|
generator, coroutine, method, string of source code, or a code object (as
|
|
returned by :func:`compile`).
|
|
|
|
This is a convenience wrapper around many of the functions listed below, most
|
|
notably :func:`get_instructions`, as iterating over a :class:`Bytecode`
|
|
instance yields the bytecode operations as :class:`Instruction` instances.
|
|
|
|
If *first_line* is not ``None``, it indicates the line number that should be
|
|
reported for the first source line in the disassembled code. Otherwise, the
|
|
source line information (if any) is taken directly from the disassembled code
|
|
object.
|
|
|
|
If *current_offset* is not ``None``, it refers to an instruction offset in the
|
|
disassembled code. Setting this means :meth:`.dis` will display a "current
|
|
instruction" marker against the specified opcode.
|
|
|
|
If *show_caches* is ``True``, :meth:`.dis` will display inline cache
|
|
entries used by the interpreter to specialize the bytecode.
|
|
|
|
If *adaptive* is ``True``, :meth:`.dis` will display specialized bytecode
|
|
that may be different from the original bytecode.
|
|
|
|
If *show_offsets* is ``True``, :meth:`.dis` will include instruction
|
|
offsets in the output.
|
|
|
|
.. classmethod:: from_traceback(tb, *, show_caches=False)
|
|
|
|
Construct a :class:`Bytecode` instance from the given traceback, setting
|
|
*current_offset* to the instruction responsible for the exception.
|
|
|
|
.. data:: codeobj
|
|
|
|
The compiled code object.
|
|
|
|
.. data:: first_line
|
|
|
|
The first source line of the code object (if available)
|
|
|
|
.. method:: dis()
|
|
|
|
Return a formatted view of the bytecode operations (the same as printed by
|
|
:func:`dis.dis`, but returned as a multi-line string).
|
|
|
|
.. method:: info()
|
|
|
|
Return a formatted multi-line string with detailed information about the
|
|
code object, like :func:`code_info`.
|
|
|
|
.. versionchanged:: 3.7
|
|
This can now handle coroutine and asynchronous generator objects.
|
|
|
|
.. versionchanged:: 3.11
|
|
Added the *show_caches* and *adaptive* parameters.
|
|
|
|
Example:
|
|
|
|
.. doctest::
|
|
|
|
>>> bytecode = dis.Bytecode(myfunc)
|
|
>>> for instr in bytecode:
|
|
... print(instr.opname)
|
|
...
|
|
RESUME
|
|
LOAD_GLOBAL
|
|
LOAD_FAST
|
|
CALL
|
|
RETURN_VALUE
|
|
|
|
|
|
Analysis functions
|
|
------------------
|
|
|
|
The :mod:`dis` module also defines the following analysis functions that convert
|
|
the input directly to the desired output. They can be useful if only a single
|
|
operation is being performed, so the intermediate analysis object isn't useful:
|
|
|
|
.. function:: code_info(x)
|
|
|
|
Return a formatted multi-line string with detailed code object information
|
|
for the supplied function, generator, asynchronous generator, coroutine,
|
|
method, source code string or code object.
|
|
|
|
Note that the exact contents of code info strings are highly implementation
|
|
dependent and they may change arbitrarily across Python VMs or Python
|
|
releases.
|
|
|
|
.. versionadded:: 3.2
|
|
|
|
.. versionchanged:: 3.7
|
|
This can now handle coroutine and asynchronous generator objects.
|
|
|
|
|
|
.. function:: show_code(x, *, file=None)
|
|
|
|
Print detailed code object information for the supplied function, method,
|
|
source code string or code object to *file* (or ``sys.stdout`` if *file*
|
|
is not specified).
|
|
|
|
This is a convenient shorthand for ``print(code_info(x), file=file)``,
|
|
intended for interactive exploration at the interpreter prompt.
|
|
|
|
.. versionadded:: 3.2
|
|
|
|
.. versionchanged:: 3.4
|
|
Added *file* parameter.
|
|
|
|
|
|
.. function:: dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False)
|
|
|
|
Disassemble the *x* object. *x* can denote either a module, a class, a
|
|
method, a function, a generator, an asynchronous generator, a coroutine,
|
|
a code object, a string of source code or a byte sequence of raw bytecode.
|
|
For a module, it disassembles all functions. For a class, it disassembles
|
|
all methods (including class and static methods). For a code object or
|
|
sequence of raw bytecode, it prints one line per bytecode instruction.
|
|
It also recursively disassembles nested code objects. These can include
|
|
generator expressions, nested functions, the bodies of nested classes,
|
|
and the code objects used for :ref:`annotation scopes <annotation-scopes>`.
|
|
Strings are first compiled to code objects with the :func:`compile`
|
|
built-in function before being disassembled. If no object is provided, this
|
|
function disassembles the last traceback.
|
|
|
|
The disassembly is written as text to the supplied *file* argument if
|
|
provided and to ``sys.stdout`` otherwise.
|
|
|
|
The maximal depth of recursion is limited by *depth* unless it is ``None``.
|
|
``depth=0`` means no recursion.
|
|
|
|
If *show_caches* is ``True``, this function will display inline cache
|
|
entries used by the interpreter to specialize the bytecode.
|
|
|
|
If *adaptive* is ``True``, this function will display specialized bytecode
|
|
that may be different from the original bytecode.
|
|
|
|
.. versionchanged:: 3.4
|
|
Added *file* parameter.
|
|
|
|
.. versionchanged:: 3.7
|
|
Implemented recursive disassembling and added *depth* parameter.
|
|
|
|
.. versionchanged:: 3.7
|
|
This can now handle coroutine and asynchronous generator objects.
|
|
|
|
.. versionchanged:: 3.11
|
|
Added the *show_caches* and *adaptive* parameters.
|
|
|
|
|
|
.. function:: distb(tb=None, *, file=None, show_caches=False, adaptive=False,
|
|
show_offset=False)
|
|
|
|
Disassemble the top-of-stack function of a traceback, using the last
|
|
traceback if none was passed. The instruction causing the exception is
|
|
indicated.
|
|
|
|
The disassembly is written as text to the supplied *file* argument if
|
|
provided and to ``sys.stdout`` otherwise.
|
|
|
|
.. versionchanged:: 3.4
|
|
Added *file* parameter.
|
|
|
|
.. versionchanged:: 3.11
|
|
Added the *show_caches* and *adaptive* parameters.
|
|
|
|
.. versionchanged:: 3.13
|
|
Added the *show_offsets* parameter.
|
|
|
|
.. function:: disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)
|
|
disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False,
|
|
show_offsets=False)
|
|
|
|
Disassemble a code object, indicating the last instruction if *lasti* was
|
|
provided. The output is divided in the following columns:
|
|
|
|
#. the line number, for the first instruction of each line
|
|
#. the current instruction, indicated as ``-->``,
|
|
#. a labelled instruction, indicated with ``>>``,
|
|
#. the address of the instruction,
|
|
#. the operation code name,
|
|
#. operation parameters, and
|
|
#. interpretation of the parameters in parentheses.
|
|
|
|
The parameter interpretation recognizes local and global variable names,
|
|
constant values, branch targets, and compare operators.
|
|
|
|
The disassembly is written as text to the supplied *file* argument if
|
|
provided and to ``sys.stdout`` otherwise.
|
|
|
|
.. versionchanged:: 3.4
|
|
Added *file* parameter.
|
|
|
|
.. versionchanged:: 3.11
|
|
Added the *show_caches* and *adaptive* parameters.
|
|
|
|
.. versionchanged:: 3.13
|
|
Added the *show_offsets* parameter.
|
|
|
|
.. function:: get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)
|
|
|
|
Return an iterator over the instructions in the supplied function, method,
|
|
source code string or code object.
|
|
|
|
The iterator generates a series of :class:`Instruction` named tuples giving
|
|
the details of each operation in the supplied code.
|
|
|
|
If *first_line* is not ``None``, it indicates the line number that should be
|
|
reported for the first source line in the disassembled code. Otherwise, the
|
|
source line information (if any) is taken directly from the disassembled code
|
|
object.
|
|
|
|
The *adaptive* parameter works as it does in :func:`dis`.
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
.. versionchanged:: 3.11
|
|
Added the *show_caches* and *adaptive* parameters.
|
|
|
|
.. versionchanged:: 3.13
|
|
The *show_caches* parameter is deprecated and has no effect. The *cache_info*
|
|
field of each instruction is populated regardless of its value.
|
|
|
|
|
|
.. function:: findlinestarts(code)
|
|
|
|
This generator function uses the :meth:`~codeobject.co_lines` method
|
|
of the :ref:`code object <code-objects>` *code* to find the offsets which
|
|
are starts of
|
|
lines in the source code. They are generated as ``(offset, lineno)`` pairs.
|
|
|
|
.. versionchanged:: 3.6
|
|
Line numbers can be decreasing. Before, they were always increasing.
|
|
|
|
.. versionchanged:: 3.10
|
|
The :pep:`626` :meth:`~codeobject.co_lines` method is used instead of the
|
|
:attr:`~codeobject.co_firstlineno` and :attr:`~codeobject.co_lnotab`
|
|
attributes of the :ref:`code object <code-objects>`.
|
|
|
|
.. versionchanged:: 3.13
|
|
Line numbers can be ``None`` for bytecode that does not map to source lines.
|
|
|
|
|
|
.. function:: findlabels(code)
|
|
|
|
Detect all offsets in the raw compiled bytecode string *code* which are jump targets, and
|
|
return a list of these offsets.
|
|
|
|
|
|
.. function:: stack_effect(opcode, oparg=None, *, jump=None)
|
|
|
|
Compute the stack effect of *opcode* with argument *oparg*.
|
|
|
|
If the code has a jump target and *jump* is ``True``, :func:`~stack_effect`
|
|
will return the stack effect of jumping. If *jump* is ``False``,
|
|
it will return the stack effect of not jumping. And if *jump* is
|
|
``None`` (default), it will return the maximal stack effect of both cases.
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
.. versionchanged:: 3.8
|
|
Added *jump* parameter.
|
|
|
|
.. versionchanged:: 3.13
|
|
If ``oparg`` is omitted (or ``None``), the stack effect is now returned
|
|
for ``oparg=0``. Previously this was an error for opcodes that use their
|
|
arg. It is also no longer an error to pass an integer ``oparg`` when
|
|
the ``opcode`` does not use it; the ``oparg`` in this case is ignored.
|
|
|
|
|
|
.. _bytecodes:
|
|
|
|
Python Bytecode Instructions
|
|
----------------------------
|
|
|
|
The :func:`get_instructions` function and :class:`Bytecode` class provide
|
|
details of bytecode instructions as :class:`Instruction` instances:
|
|
|
|
.. class:: Instruction
|
|
|
|
Details for a bytecode operation
|
|
|
|
.. data:: opcode
|
|
|
|
numeric code for operation, corresponding to the opcode values listed
|
|
below and the bytecode values in the :ref:`opcode_collections`.
|
|
|
|
|
|
.. data:: opname
|
|
|
|
human readable name for operation
|
|
|
|
|
|
.. data:: baseopcode
|
|
|
|
numeric code for the base operation if operation is specialized;
|
|
otherwise equal to :data:`opcode`
|
|
|
|
|
|
.. data:: baseopname
|
|
|
|
human readable name for the base operation if operation is specialized;
|
|
otherwise equal to :data:`opname`
|
|
|
|
|
|
.. data:: arg
|
|
|
|
numeric argument to operation (if any), otherwise ``None``
|
|
|
|
.. data:: oparg
|
|
|
|
alias for :data:`arg`
|
|
|
|
.. data:: argval
|
|
|
|
resolved arg value (if any), otherwise ``None``
|
|
|
|
|
|
.. data:: argrepr
|
|
|
|
human readable description of operation argument (if any),
|
|
otherwise an empty string.
|
|
|
|
|
|
.. data:: offset
|
|
|
|
start index of operation within bytecode sequence
|
|
|
|
|
|
.. data:: start_offset
|
|
|
|
start index of operation within bytecode sequence, including prefixed
|
|
``EXTENDED_ARG`` operations if present; otherwise equal to :data:`offset`
|
|
|
|
|
|
.. data:: cache_offset
|
|
|
|
start index of the cache entries following the operation
|
|
|
|
|
|
.. data:: end_offset
|
|
|
|
end index of the cache entries following the operation
|
|
|
|
|
|
.. data:: starts_line
|
|
|
|
``True`` if this opcode starts a source line, otherwise ``False``
|
|
|
|
|
|
.. data:: line_number
|
|
|
|
source line number associated with this opcode (if any), otherwise ``None``
|
|
|
|
|
|
.. data:: is_jump_target
|
|
|
|
``True`` if other code jumps to here, otherwise ``False``
|
|
|
|
|
|
.. data:: jump_target
|
|
|
|
bytecode index of the jump target if this is a jump operation,
|
|
otherwise ``None``
|
|
|
|
|
|
.. data:: positions
|
|
|
|
:class:`dis.Positions` object holding the
|
|
start and end locations that are covered by this instruction.
|
|
|
|
.. data::cache_info
|
|
|
|
Information about the cache entries of this instruction, as
|
|
triplets of the form ``(name, size, data)``, where the ``name``
|
|
and ``size`` describe the cache format and data is the contents
|
|
of the cache. ``cache_info`` is ``None`` if the instruction does not have
|
|
caches.
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
.. versionchanged:: 3.11
|
|
|
|
Field ``positions`` is added.
|
|
|
|
.. versionchanged:: 3.13
|
|
|
|
Changed field ``starts_line``.
|
|
|
|
Added fields ``start_offset``, ``cache_offset``, ``end_offset``,
|
|
``baseopname``, ``baseopcode``, ``jump_target``, ``oparg``,
|
|
``line_number`` and ``cache_info``.
|
|
|
|
|
|
.. class:: Positions
|
|
|
|
In case the information is not available, some fields might be ``None``.
|
|
|
|
.. data:: lineno
|
|
.. data:: end_lineno
|
|
.. data:: col_offset
|
|
.. data:: end_col_offset
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
The Python compiler currently generates the following bytecode instructions.
|
|
|
|
|
|
**General instructions**
|
|
|
|
In the following, We will refer to the interpreter stack as ``STACK`` and describe
|
|
operations on it as if it was a Python list. The top of the stack corresponds to
|
|
``STACK[-1]`` in this language.
|
|
|
|
.. opcode:: NOP
|
|
|
|
Do nothing code. Used as a placeholder by the bytecode optimizer, and to
|
|
generate line tracing events.
|
|
|
|
|
|
.. opcode:: POP_TOP
|
|
|
|
Removes the top-of-stack item::
|
|
|
|
STACK.pop()
|
|
|
|
|
|
.. opcode:: END_FOR
|
|
|
|
Removes the top-of-stack item.
|
|
Equivalent to ``POP_TOP``.
|
|
Used to clean up at the end of loops, hence the name.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: END_SEND
|
|
|
|
Implements ``del STACK[-2]``.
|
|
Used to clean up when a generator exits.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: COPY (i)
|
|
|
|
Push the i-th item to the top of the stack without removing it from its original
|
|
location::
|
|
|
|
assert i > 0
|
|
STACK.append(STACK[-i])
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: SWAP (i)
|
|
|
|
Swap the top of the stack with the i-th element::
|
|
|
|
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: CACHE
|
|
|
|
Rather than being an actual instruction, this opcode is used to mark extra
|
|
space for the interpreter to cache useful data directly in the bytecode
|
|
itself. It is automatically hidden by all ``dis`` utilities, but can be
|
|
viewed with ``show_caches=True``.
|
|
|
|
Logically, this space is part of the preceding instruction. Many opcodes
|
|
expect to be followed by an exact number of caches, and will instruct the
|
|
interpreter to skip over them at runtime.
|
|
|
|
Populated caches can look like arbitrary instructions, so great care should
|
|
be taken when reading or modifying raw, adaptive bytecode containing
|
|
quickened data.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
**Unary operations**
|
|
|
|
Unary operations take the top of the stack, apply the operation, and push the
|
|
result back on the stack.
|
|
|
|
|
|
.. opcode:: UNARY_NEGATIVE
|
|
|
|
Implements ``STACK[-1] = -STACK[-1]``.
|
|
|
|
|
|
.. opcode:: UNARY_NOT
|
|
|
|
Implements ``STACK[-1] = not STACK[-1]``.
|
|
|
|
.. versionchanged:: 3.13
|
|
This instruction now requires an exact :class:`bool` operand.
|
|
|
|
|
|
.. opcode:: UNARY_INVERT
|
|
|
|
Implements ``STACK[-1] = ~STACK[-1]``.
|
|
|
|
|
|
.. opcode:: GET_ITER
|
|
|
|
Implements ``STACK[-1] = iter(STACK[-1])``.
|
|
|
|
|
|
.. opcode:: GET_YIELD_FROM_ITER
|
|
|
|
If ``STACK[-1]`` is a :term:`generator iterator` or :term:`coroutine` object
|
|
it is left as is. Otherwise, implements ``STACK[-1] = iter(STACK[-1])``.
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
|
|
.. opcode:: TO_BOOL
|
|
|
|
Implements ``STACK[-1] = bool(STACK[-1])``.
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
|
|
**Binary and in-place operations**
|
|
|
|
Binary operations remove the top two items from the stack (``STACK[-1]`` and
|
|
``STACK[-2]``). They perform the operation, then put the result back on the stack.
|
|
|
|
In-place operations are like binary operations, but the operation is done in-place
|
|
when ``STACK[-2]`` supports it, and the resulting ``STACK[-1]`` may be (but does
|
|
not have to be) the original ``STACK[-2]``.
|
|
|
|
|
|
.. opcode:: BINARY_OP (op)
|
|
|
|
Implements the binary and in-place operators (depending on the value of
|
|
*op*)::
|
|
|
|
rhs = STACK.pop()
|
|
lhs = STACK.pop()
|
|
STACK.append(lhs op rhs)
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: BINARY_SUBSCR
|
|
|
|
Implements::
|
|
|
|
key = STACK.pop()
|
|
container = STACK.pop()
|
|
STACK.append(container[key])
|
|
|
|
|
|
.. opcode:: STORE_SUBSCR
|
|
|
|
Implements::
|
|
|
|
key = STACK.pop()
|
|
container = STACK.pop()
|
|
value = STACK.pop()
|
|
container[key] = value
|
|
|
|
|
|
.. opcode:: DELETE_SUBSCR
|
|
|
|
Implements::
|
|
|
|
key = STACK.pop()
|
|
container = STACK.pop()
|
|
del container[key]
|
|
|
|
.. opcode:: BINARY_SLICE
|
|
|
|
Implements::
|
|
|
|
end = STACK.pop()
|
|
start = STACK.pop()
|
|
container = STACK.pop()
|
|
STACK.append(container[start:end])
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: STORE_SLICE
|
|
|
|
Implements::
|
|
|
|
end = STACK.pop()
|
|
start = STACK.pop()
|
|
container = STACK.pop()
|
|
values = STACK.pop()
|
|
container[start:end] = value
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
**Coroutine opcodes**
|
|
|
|
.. opcode:: GET_AWAITABLE (where)
|
|
|
|
Implements ``STACK[-1] = get_awaitable(STACK[-1])``, where ``get_awaitable(o)``
|
|
returns ``o`` if ``o`` is a coroutine object or a generator object with
|
|
the :data:`~inspect.CO_ITERABLE_COROUTINE` flag, or resolves
|
|
``o.__await__``.
|
|
|
|
If the ``where`` operand is nonzero, it indicates where the instruction
|
|
occurs:
|
|
|
|
* ``1``: After a call to ``__aenter__``
|
|
* ``2``: After a call to ``__aexit__``
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
.. versionchanged:: 3.11
|
|
Previously, this instruction did not have an oparg.
|
|
|
|
|
|
.. opcode:: GET_AITER
|
|
|
|
Implements ``STACK[-1] = STACK[-1].__aiter__()``.
|
|
|
|
.. versionadded:: 3.5
|
|
.. versionchanged:: 3.7
|
|
Returning awaitable objects from ``__aiter__`` is no longer
|
|
supported.
|
|
|
|
|
|
.. opcode:: GET_ANEXT
|
|
|
|
Implement ``STACK.append(get_awaitable(STACK[-1].__anext__()))`` to the stack.
|
|
See ``GET_AWAITABLE`` for details about ``get_awaitable``.
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
|
|
.. opcode:: END_ASYNC_FOR
|
|
|
|
Terminates an :keyword:`async for` loop. Handles an exception raised
|
|
when awaiting a next item. The stack contains the async iterable in
|
|
``STACK[-2]`` and the raised exception in ``STACK[-1]``. Both are popped.
|
|
If the exception is not :exc:`StopAsyncIteration`, it is re-raised.
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
.. versionchanged:: 3.11
|
|
Exception representation on the stack now consist of one, not three, items.
|
|
|
|
|
|
.. opcode:: CLEANUP_THROW
|
|
|
|
Handles an exception raised during a :meth:`~generator.throw` or
|
|
:meth:`~generator.close` call through the current frame. If ``STACK[-1]`` is an
|
|
instance of :exc:`StopIteration`, pop three values from the stack and push
|
|
its ``value`` member. Otherwise, re-raise ``STACK[-1]``.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: BEFORE_ASYNC_WITH
|
|
|
|
Resolves ``__aenter__`` and ``__aexit__`` from ``STACK[-1]``.
|
|
Pushes ``__aexit__`` and result of ``__aenter__()`` to the stack::
|
|
|
|
STACK.extend((__aexit__, __aenter__())
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
|
|
|
|
**Miscellaneous opcodes**
|
|
|
|
.. opcode:: SET_ADD (i)
|
|
|
|
Implements::
|
|
|
|
item = STACK.pop()
|
|
set.add(STACK[-i], item)
|
|
|
|
Used to implement set comprehensions.
|
|
|
|
|
|
.. opcode:: LIST_APPEND (i)
|
|
|
|
Implements::
|
|
|
|
item = STACK.pop()
|
|
list.append(STACK[-i], item)
|
|
|
|
Used to implement list comprehensions.
|
|
|
|
|
|
.. opcode:: MAP_ADD (i)
|
|
|
|
Implements::
|
|
|
|
value = STACK.pop()
|
|
key = STACK.pop()
|
|
dict.__setitem__(STACK[-i], key, value)
|
|
|
|
Used to implement dict comprehensions.
|
|
|
|
.. versionadded:: 3.1
|
|
.. versionchanged:: 3.8
|
|
Map value is ``STACK[-1]`` and map key is ``STACK[-2]``. Before, those
|
|
were reversed.
|
|
|
|
For all of the :opcode:`SET_ADD`, :opcode:`LIST_APPEND` and :opcode:`MAP_ADD`
|
|
instructions, while the added value or key/value pair is popped off, the
|
|
container object remains on the stack so that it is available for further
|
|
iterations of the loop.
|
|
|
|
|
|
.. opcode:: RETURN_VALUE
|
|
|
|
Returns with ``STACK[-1]`` to the caller of the function.
|
|
|
|
|
|
.. opcode:: RETURN_CONST (consti)
|
|
|
|
Returns with ``co_consts[consti]`` to the caller of the function.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: YIELD_VALUE
|
|
|
|
Yields ``STACK.pop()`` from a :term:`generator`.
|
|
|
|
.. versionchanged:: 3.11
|
|
oparg set to be the stack depth.
|
|
|
|
.. versionchanged:: 3.12
|
|
oparg set to be the exception block depth, for efficient closing of generators.
|
|
|
|
.. versionchanged:: 3.13
|
|
oparg is ``1`` if this instruction is part of a yield-from or await, and ``0``
|
|
otherwise.
|
|
|
|
.. opcode:: SETUP_ANNOTATIONS
|
|
|
|
Checks whether ``__annotations__`` is defined in ``locals()``, if not it is
|
|
set up to an empty ``dict``. This opcode is only emitted if a class
|
|
or module body contains :term:`variable annotations <variable annotation>`
|
|
statically.
|
|
|
|
.. versionadded:: 3.6
|
|
|
|
|
|
.. opcode:: POP_EXCEPT
|
|
|
|
Pops a value from the stack, which is used to restore the exception state.
|
|
|
|
.. versionchanged:: 3.11
|
|
Exception representation on the stack now consist of one, not three, items.
|
|
|
|
.. opcode:: RERAISE
|
|
|
|
Re-raises the exception currently on top of the stack. If oparg is non-zero,
|
|
pops an additional value from the stack which is used to set
|
|
:attr:`~frame.f_lasti` of the current frame.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
.. versionchanged:: 3.11
|
|
Exception representation on the stack now consist of one, not three, items.
|
|
|
|
.. opcode:: PUSH_EXC_INFO
|
|
|
|
Pops a value from the stack. Pushes the current exception to the top of the stack.
|
|
Pushes the value originally popped back to the stack.
|
|
Used in exception handlers.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
.. opcode:: CHECK_EXC_MATCH
|
|
|
|
Performs exception matching for ``except``. Tests whether the ``STACK[-2]``
|
|
is an exception matching ``STACK[-1]``. Pops ``STACK[-1]`` and pushes the boolean
|
|
result of the test.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
.. opcode:: CHECK_EG_MATCH
|
|
|
|
Performs exception matching for ``except*``. Applies ``split(STACK[-1])`` on
|
|
the exception group representing ``STACK[-2]``.
|
|
|
|
In case of a match, pops two items from the stack and pushes the
|
|
non-matching subgroup (``None`` in case of full match) followed by the
|
|
matching subgroup. When there is no match, pops one item (the match
|
|
type) and pushes ``None``.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
.. opcode:: WITH_EXCEPT_START
|
|
|
|
Calls the function in position 4 on the stack with arguments (type, val, tb)
|
|
representing the exception at the top of the stack.
|
|
Used to implement the call ``context_manager.__exit__(*exc_info())`` when an exception
|
|
has occurred in a :keyword:`with` statement.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
.. versionchanged:: 3.11
|
|
The ``__exit__`` function is in position 4 of the stack rather than 7.
|
|
Exception representation on the stack now consist of one, not three, items.
|
|
|
|
|
|
.. opcode:: LOAD_ASSERTION_ERROR
|
|
|
|
Pushes :exc:`AssertionError` onto the stack. Used by the :keyword:`assert`
|
|
statement.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. opcode:: LOAD_BUILD_CLASS
|
|
|
|
Pushes :func:`!builtins.__build_class__` onto the stack. It is later called
|
|
to construct a class.
|
|
|
|
|
|
.. opcode:: BEFORE_WITH
|
|
|
|
This opcode performs several operations before a with block starts. First,
|
|
it loads :meth:`~object.__exit__` from the context manager and pushes it onto
|
|
the stack for later use by :opcode:`WITH_EXCEPT_START`. Then,
|
|
:meth:`~object.__enter__` is called. Finally, the result of calling the
|
|
``__enter__()`` method is pushed onto the stack.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: GET_LEN
|
|
|
|
Perform ``STACK.append(len(STACK[-1]))``.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. opcode:: MATCH_MAPPING
|
|
|
|
If ``STACK[-1]`` is an instance of :class:`collections.abc.Mapping` (or, more
|
|
technically: if it has the :c:macro:`Py_TPFLAGS_MAPPING` flag set in its
|
|
:c:member:`~PyTypeObject.tp_flags`), push ``True`` onto the stack. Otherwise,
|
|
push ``False``.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. opcode:: MATCH_SEQUENCE
|
|
|
|
If ``STACK[-1]`` is an instance of :class:`collections.abc.Sequence` and is *not* an instance
|
|
of :class:`str`/:class:`bytes`/:class:`bytearray` (or, more technically: if it has
|
|
the :c:macro:`Py_TPFLAGS_SEQUENCE` flag set in its :c:member:`~PyTypeObject.tp_flags`),
|
|
push ``True`` onto the stack. Otherwise, push ``False``.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. opcode:: MATCH_KEYS
|
|
|
|
``STACK[-1]`` is a tuple of mapping keys, and ``STACK[-2]`` is the match subject.
|
|
If ``STACK[-2]`` contains all of the keys in ``STACK[-1]``, push a :class:`tuple`
|
|
containing the corresponding values. Otherwise, push ``None``.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
.. versionchanged:: 3.11
|
|
Previously, this instruction also pushed a boolean value indicating
|
|
success (``True``) or failure (``False``).
|
|
|
|
|
|
.. opcode:: STORE_NAME (namei)
|
|
|
|
Implements ``name = STACK.pop()``. *namei* is the index of *name* in the attribute
|
|
:attr:`~codeobject.co_names` of the :ref:`code object <code-objects>`.
|
|
The compiler tries to use :opcode:`STORE_FAST` or :opcode:`STORE_GLOBAL` if possible.
|
|
|
|
|
|
.. opcode:: DELETE_NAME (namei)
|
|
|
|
Implements ``del name``, where *namei* is the index into :attr:`~codeobject.co_names`
|
|
attribute of the :ref:`code object <code-objects>`.
|
|
|
|
|
|
.. opcode:: UNPACK_SEQUENCE (count)
|
|
|
|
Unpacks ``STACK[-1]`` into *count* individual values, which are put onto the stack
|
|
right-to-left. Require there to be exactly *count* values.::
|
|
|
|
assert(len(STACK[-1]) == count)
|
|
STACK.extend(STACK.pop()[:-count-1:-1])
|
|
|
|
|
|
.. opcode:: UNPACK_EX (counts)
|
|
|
|
Implements assignment with a starred target: Unpacks an iterable in ``STACK[-1]``
|
|
into individual values, where the total number of values can be smaller than the
|
|
number of items in the iterable: one of the new values will be a list of all
|
|
leftover items.
|
|
|
|
The number of values before and after the list value is limited to 255.
|
|
|
|
The number of values before the list value is encoded in the argument of the
|
|
opcode. The number of values after the list if any is encoded using an
|
|
``EXTENDED_ARG``. As a consequence, the argument can be seen as a two bytes values
|
|
where the low byte of *counts* is the number of values before the list value, the
|
|
high byte of *counts* the number of values after it.
|
|
|
|
The extracted values are put onto the stack right-to-left, i.e. ``a, *b, c = d``
|
|
will be stored after execution as ``STACK.extend((a, b, c))``.
|
|
|
|
|
|
.. opcode:: STORE_ATTR (namei)
|
|
|
|
Implements::
|
|
|
|
obj = STACK.pop()
|
|
value = STACK.pop()
|
|
obj.name = value
|
|
|
|
where *namei* is the index of name in :attr:`~codeobject.co_names` of the
|
|
:ref:`code object <code-objects>`.
|
|
|
|
.. opcode:: DELETE_ATTR (namei)
|
|
|
|
Implements::
|
|
|
|
obj = STACK.pop()
|
|
del obj.name
|
|
|
|
where *namei* is the index of name into :attr:`~codeobject.co_names` of the
|
|
:ref:`code object <code-objects>`.
|
|
|
|
|
|
.. opcode:: STORE_GLOBAL (namei)
|
|
|
|
Works as :opcode:`STORE_NAME`, but stores the name as a global.
|
|
|
|
|
|
.. opcode:: DELETE_GLOBAL (namei)
|
|
|
|
Works as :opcode:`DELETE_NAME`, but deletes a global name.
|
|
|
|
|
|
.. opcode:: LOAD_CONST (consti)
|
|
|
|
Pushes ``co_consts[consti]`` onto the stack.
|
|
|
|
|
|
.. opcode:: LOAD_NAME (namei)
|
|
|
|
Pushes the value associated with ``co_names[namei]`` onto the stack.
|
|
The name is looked up within the locals, then the globals, then the builtins.
|
|
|
|
|
|
.. opcode:: LOAD_LOCALS
|
|
|
|
Pushes a reference to the locals dictionary onto the stack. This is used
|
|
to prepare namespace dictionaries for :opcode:`LOAD_FROM_DICT_OR_DEREF`
|
|
and :opcode:`LOAD_FROM_DICT_OR_GLOBALS`.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: LOAD_FROM_DICT_OR_GLOBALS (i)
|
|
|
|
Pops a mapping off the stack and looks up the value for ``co_names[namei]``.
|
|
If the name is not found there, looks it up in the globals and then the builtins,
|
|
similar to :opcode:`LOAD_GLOBAL`.
|
|
This is used for loading global variables in
|
|
:ref:`annotation scopes <annotation-scopes>` within class bodies.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: BUILD_TUPLE (count)
|
|
|
|
Creates a tuple consuming *count* items from the stack, and pushes the
|
|
resulting tuple onto the stack.::
|
|
|
|
assert count > 0
|
|
STACK, values = STACK[:-count], STACK[-count:]
|
|
STACK.append(tuple(values))
|
|
|
|
|
|
.. opcode:: BUILD_LIST (count)
|
|
|
|
Works as :opcode:`BUILD_TUPLE`, but creates a list.
|
|
|
|
|
|
.. opcode:: BUILD_SET (count)
|
|
|
|
Works as :opcode:`BUILD_TUPLE`, but creates a set.
|
|
|
|
|
|
.. opcode:: BUILD_MAP (count)
|
|
|
|
Pushes a new dictionary object onto the stack. Pops ``2 * count`` items
|
|
so that the dictionary holds *count* entries:
|
|
``{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}``.
|
|
|
|
.. versionchanged:: 3.5
|
|
The dictionary is created from stack items instead of creating an
|
|
empty dictionary pre-sized to hold *count* items.
|
|
|
|
|
|
.. opcode:: BUILD_CONST_KEY_MAP (count)
|
|
|
|
The version of :opcode:`BUILD_MAP` specialized for constant keys. Pops the
|
|
top element on the stack which contains a tuple of keys, then starting from
|
|
``STACK[-2]``, pops *count* values to form values in the built dictionary.
|
|
|
|
.. versionadded:: 3.6
|
|
|
|
|
|
.. opcode:: BUILD_STRING (count)
|
|
|
|
Concatenates *count* strings from the stack and pushes the resulting string
|
|
onto the stack.
|
|
|
|
.. versionadded:: 3.6
|
|
|
|
|
|
.. opcode:: LIST_EXTEND (i)
|
|
|
|
Implements::
|
|
|
|
seq = STACK.pop()
|
|
list.extend(STACK[-i], seq)
|
|
|
|
Used to build lists.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. opcode:: SET_UPDATE (i)
|
|
|
|
Implements::
|
|
|
|
seq = STACK.pop()
|
|
set.update(STACK[-i], seq)
|
|
|
|
Used to build sets.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. opcode:: DICT_UPDATE (i)
|
|
|
|
Implements::
|
|
|
|
map = STACK.pop()
|
|
dict.update(STACK[-i], map)
|
|
|
|
Used to build dicts.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. opcode:: DICT_MERGE (i)
|
|
|
|
Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. opcode:: LOAD_ATTR (namei)
|
|
|
|
If the low bit of ``namei`` is not set, this replaces ``STACK[-1]`` with
|
|
``getattr(STACK[-1], co_names[namei>>1])``.
|
|
|
|
If the low bit of ``namei`` is set, this will attempt to load a method named
|
|
``co_names[namei>>1]`` from the ``STACK[-1]`` object. ``STACK[-1]`` is popped.
|
|
This bytecode distinguishes two cases: if ``STACK[-1]`` has a method with the
|
|
correct name, the bytecode pushes the unbound method and ``STACK[-1]``.
|
|
``STACK[-1]`` will be used as the first argument (``self``) by :opcode:`CALL`
|
|
or :opcode:`CALL_KW` when calling the unbound method.
|
|
Otherwise, ``NULL`` and the object returned by
|
|
the attribute lookup are pushed.
|
|
|
|
.. versionchanged:: 3.12
|
|
If the low bit of ``namei`` is set, then a ``NULL`` or ``self`` is
|
|
pushed to the stack before the attribute or unbound method respectively.
|
|
|
|
|
|
.. opcode:: LOAD_SUPER_ATTR (namei)
|
|
|
|
This opcode implements :func:`super`, both in its zero-argument and
|
|
two-argument forms (e.g. ``super().method()``, ``super().attr`` and
|
|
``super(cls, self).method()``, ``super(cls, self).attr``).
|
|
|
|
It pops three values from the stack (from top of stack down):
|
|
|
|
* ``self``: the first argument to the current method
|
|
* ``cls``: the class within which the current method was defined
|
|
* the global ``super``
|
|
|
|
With respect to its argument, it works similarly to :opcode:`LOAD_ATTR`,
|
|
except that ``namei`` is shifted left by 2 bits instead of 1.
|
|
|
|
The low bit of ``namei`` signals to attempt a method load, as with
|
|
:opcode:`LOAD_ATTR`, which results in pushing ``None`` and the loaded method.
|
|
When it is unset a single value is pushed to the stack.
|
|
|
|
The second-low bit of ``namei``, if set, means that this was a two-argument
|
|
call to :func:`super` (unset means zero-argument).
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: COMPARE_OP (opname)
|
|
|
|
Performs a Boolean operation. The operation name can be found in
|
|
``cmp_op[opname >> 5]``. If the fifth-lowest bit of ``opname`` is set
|
|
(``opname & 16``), the result should be coerced to ``bool``.
|
|
|
|
.. versionchanged:: 3.13
|
|
The fifth-lowest bit of the oparg now indicates a forced conversion to
|
|
:class:`bool`.
|
|
|
|
|
|
.. opcode:: IS_OP (invert)
|
|
|
|
Performs ``is`` comparison, or ``is not`` if ``invert`` is 1.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. opcode:: CONTAINS_OP (invert)
|
|
|
|
Performs ``in`` comparison, or ``not in`` if ``invert`` is 1.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
|
|
.. opcode:: IMPORT_NAME (namei)
|
|
|
|
Imports the module ``co_names[namei]``. ``STACK[-1]`` and ``STACK[-2]`` are
|
|
popped and provide the *fromlist* and *level* arguments of :func:`__import__`.
|
|
The module object is pushed onto the stack. The current namespace is not affected: for a proper import statement, a subsequent :opcode:`STORE_FAST` instruction
|
|
modifies the namespace.
|
|
|
|
|
|
.. opcode:: IMPORT_FROM (namei)
|
|
|
|
Loads the attribute ``co_names[namei]`` from the module found in ``STACK[-1]``.
|
|
The resulting object is pushed onto the stack, to be subsequently stored by a
|
|
:opcode:`STORE_FAST` instruction.
|
|
|
|
|
|
.. opcode:: JUMP_FORWARD (delta)
|
|
|
|
Increments bytecode counter by *delta*.
|
|
|
|
|
|
.. opcode:: JUMP_BACKWARD (delta)
|
|
|
|
Decrements bytecode counter by *delta*. Checks for interrupts.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: JUMP_BACKWARD_NO_INTERRUPT (delta)
|
|
|
|
Decrements bytecode counter by *delta*. Does not check for interrupts.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: POP_JUMP_IF_TRUE (delta)
|
|
|
|
If ``STACK[-1]`` is true, increments the bytecode counter by *delta*.
|
|
``STACK[-1]`` is popped.
|
|
|
|
.. versionchanged:: 3.11
|
|
The oparg is now a relative delta rather than an absolute target.
|
|
This opcode is a pseudo-instruction, replaced in final bytecode by
|
|
the directed versions (forward/backward).
|
|
|
|
.. versionchanged:: 3.12
|
|
This is no longer a pseudo-instruction.
|
|
|
|
.. versionchanged:: 3.13
|
|
This instruction now requires an exact :class:`bool` operand.
|
|
|
|
.. opcode:: POP_JUMP_IF_FALSE (delta)
|
|
|
|
If ``STACK[-1]`` is false, increments the bytecode counter by *delta*.
|
|
``STACK[-1]`` is popped.
|
|
|
|
.. versionchanged:: 3.11
|
|
The oparg is now a relative delta rather than an absolute target.
|
|
This opcode is a pseudo-instruction, replaced in final bytecode by
|
|
the directed versions (forward/backward).
|
|
|
|
.. versionchanged:: 3.12
|
|
This is no longer a pseudo-instruction.
|
|
|
|
.. versionchanged:: 3.13
|
|
This instruction now requires an exact :class:`bool` operand.
|
|
|
|
.. opcode:: POP_JUMP_IF_NOT_NONE (delta)
|
|
|
|
If ``STACK[-1]`` is not ``None``, increments the bytecode counter by *delta*.
|
|
``STACK[-1]`` is popped.
|
|
|
|
This opcode is a pseudo-instruction, replaced in final bytecode by
|
|
the directed versions (forward/backward).
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
.. versionchanged:: 3.12
|
|
This is no longer a pseudo-instruction.
|
|
|
|
|
|
.. opcode:: POP_JUMP_IF_NONE (delta)
|
|
|
|
If ``STACK[-1]`` is ``None``, increments the bytecode counter by *delta*.
|
|
``STACK[-1]`` is popped.
|
|
|
|
This opcode is a pseudo-instruction, replaced in final bytecode by
|
|
the directed versions (forward/backward).
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
.. versionchanged:: 3.12
|
|
This is no longer a pseudo-instruction.
|
|
|
|
.. opcode:: FOR_ITER (delta)
|
|
|
|
``STACK[-1]`` is an :term:`iterator`. Call its :meth:`~iterator.__next__` method.
|
|
If this yields a new value, push it on the stack (leaving the iterator below
|
|
it). If the iterator indicates it is exhausted then the byte code counter is
|
|
incremented by *delta*.
|
|
|
|
.. versionchanged:: 3.12
|
|
Up until 3.11 the iterator was popped when it was exhausted.
|
|
|
|
.. opcode:: LOAD_GLOBAL (namei)
|
|
|
|
Loads the global named ``co_names[namei>>1]`` onto the stack.
|
|
|
|
.. versionchanged:: 3.11
|
|
If the low bit of ``namei`` is set, then a ``NULL`` is pushed to the
|
|
stack before the global variable.
|
|
|
|
.. opcode:: LOAD_FAST (var_num)
|
|
|
|
Pushes a reference to the local ``co_varnames[var_num]`` onto the stack.
|
|
|
|
.. versionchanged:: 3.12
|
|
This opcode is now only used in situations where the local variable is
|
|
guaranteed to be initialized. It cannot raise :exc:`UnboundLocalError`.
|
|
|
|
.. opcode:: LOAD_FAST_CHECK (var_num)
|
|
|
|
Pushes a reference to the local ``co_varnames[var_num]`` onto the stack,
|
|
raising an :exc:`UnboundLocalError` if the local variable has not been
|
|
initialized.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
.. opcode:: LOAD_FAST_AND_CLEAR (var_num)
|
|
|
|
Pushes a reference to the local ``co_varnames[var_num]`` onto the stack (or
|
|
pushes ``NULL`` onto the stack if the local variable has not been
|
|
initialized) and sets ``co_varnames[var_num]`` to ``NULL``.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
.. opcode:: STORE_FAST (var_num)
|
|
|
|
Stores ``STACK.pop()`` into the local ``co_varnames[var_num]``.
|
|
|
|
|
|
.. opcode:: DELETE_FAST (var_num)
|
|
|
|
Deletes local ``co_varnames[var_num]``.
|
|
|
|
|
|
.. opcode:: MAKE_CELL (i)
|
|
|
|
Creates a new cell in slot ``i``. If that slot is nonempty then
|
|
that value is stored into the new cell.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: LOAD_DEREF (i)
|
|
|
|
Loads the cell contained in slot ``i`` of the "fast locals" storage.
|
|
Pushes a reference to the object the cell contains on the stack.
|
|
|
|
.. versionchanged:: 3.11
|
|
``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`.
|
|
|
|
|
|
.. opcode:: LOAD_FROM_DICT_OR_DEREF (i)
|
|
|
|
Pops a mapping off the stack and looks up the name associated with
|
|
slot ``i`` of the "fast locals" storage in this mapping.
|
|
If the name is not found there, loads it from the cell contained in
|
|
slot ``i``, similar to :opcode:`LOAD_DEREF`. This is used for loading
|
|
free variables in class bodies (which previously used
|
|
:opcode:`!LOAD_CLASSDEREF`) and in
|
|
:ref:`annotation scopes <annotation-scopes>` within class bodies.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. opcode:: STORE_DEREF (i)
|
|
|
|
Stores ``STACK.pop()`` into the cell contained in slot ``i`` of the "fast locals"
|
|
storage.
|
|
|
|
.. versionchanged:: 3.11
|
|
``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`.
|
|
|
|
|
|
.. opcode:: DELETE_DEREF (i)
|
|
|
|
Empties the cell contained in slot ``i`` of the "fast locals" storage.
|
|
Used by the :keyword:`del` statement.
|
|
|
|
.. versionadded:: 3.2
|
|
|
|
.. versionchanged:: 3.11
|
|
``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`.
|
|
|
|
|
|
.. opcode:: COPY_FREE_VARS (n)
|
|
|
|
Copies the ``n`` free variables from the closure into the frame.
|
|
Removes the need for special code on the caller's side when calling
|
|
closures.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: RAISE_VARARGS (argc)
|
|
|
|
Raises an exception using one of the 3 forms of the ``raise`` statement,
|
|
depending on the value of *argc*:
|
|
|
|
* 0: ``raise`` (re-raise previous exception)
|
|
* 1: ``raise STACK[-1]`` (raise exception instance or type at ``STACK[-1]``)
|
|
* 2: ``raise STACK[-2] from STACK[-1]`` (raise exception instance or type at
|
|
``STACK[-2]`` with ``__cause__`` set to ``STACK[-1]``)
|
|
|
|
|
|
.. opcode:: CALL (argc)
|
|
|
|
Calls a callable object with the number of arguments specified by ``argc``.
|
|
On the stack are (in ascending order):
|
|
|
|
* The callable
|
|
* ``self`` or ``NULL``
|
|
* The remaining positional arguments
|
|
|
|
``argc`` is the total of the positional arguments, excluding ``self``.
|
|
|
|
``CALL`` pops all arguments and the callable object off the stack,
|
|
calls the callable object with those arguments, and pushes the return value
|
|
returned by the callable object.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
.. versionchanged:: 3.13
|
|
The callable now always appears at the same position on the stack.
|
|
|
|
.. versionchanged:: 3.13
|
|
Calls with keyword arguments are now handled by :opcode:`CALL_KW`.
|
|
|
|
|
|
.. opcode:: CALL_KW (argc)
|
|
|
|
Calls a callable object with the number of arguments specified by ``argc``,
|
|
including one or more named arguments. On the stack are (in ascending order):
|
|
|
|
* The callable
|
|
* ``self`` or ``NULL``
|
|
* The remaining positional arguments
|
|
* The named arguments
|
|
* A :class:`tuple` of keyword argument names
|
|
|
|
``argc`` is the total of the positional and named arguments, excluding ``self``.
|
|
The length of the tuple of keyword argument names is the number of named arguments.
|
|
|
|
``CALL_KW`` pops all arguments, the keyword names, and the callable object
|
|
off the stack, calls the callable object with those arguments, and pushes the
|
|
return value returned by the callable object.
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
|
|
.. opcode:: CALL_FUNCTION_EX (flags)
|
|
|
|
Calls a callable object with variable set of positional and keyword
|
|
arguments. If the lowest bit of *flags* is set, the top of the stack
|
|
contains a mapping object containing additional keyword arguments.
|
|
Before the callable is called, the mapping object and iterable object
|
|
are each "unpacked" and their contents passed in as keyword and
|
|
positional arguments respectively.
|
|
``CALL_FUNCTION_EX`` pops all arguments and the callable object off the stack,
|
|
calls the callable object with those arguments, and pushes the return value
|
|
returned by the callable object.
|
|
|
|
.. versionadded:: 3.6
|
|
|
|
|
|
.. opcode:: PUSH_NULL
|
|
|
|
Pushes a ``NULL`` to the stack.
|
|
Used in the call sequence to match the ``NULL`` pushed by
|
|
:opcode:`LOAD_METHOD` for non-method calls.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: MAKE_FUNCTION
|
|
|
|
Pushes a new function object on the stack built from the code object at ``STACK[1]``.
|
|
|
|
.. versionchanged:: 3.10
|
|
Flag value ``0x04`` is a tuple of strings instead of dictionary
|
|
|
|
.. versionchanged:: 3.11
|
|
Qualified name at ``STACK[-1]`` was removed.
|
|
|
|
.. versionchanged:: 3.13
|
|
Extra function attributes on the stack, signaled by oparg flags, were
|
|
removed. They now use :opcode:`SET_FUNCTION_ATTRIBUTE`.
|
|
|
|
|
|
.. opcode:: SET_FUNCTION_ATTRIBUTE (flag)
|
|
|
|
Sets an attribute on a function object. Expects the function at ``STACK[-1]``
|
|
and the attribute value to set at ``STACK[-2]``; consumes both and leaves the
|
|
function at ``STACK[-1]``. The flag determines which attribute to set:
|
|
|
|
* ``0x01`` a tuple of default values for positional-only and
|
|
positional-or-keyword parameters in positional order
|
|
* ``0x02`` a dictionary of keyword-only parameters' default values
|
|
* ``0x04`` a tuple of strings containing parameters' annotations
|
|
* ``0x08`` a tuple containing cells for free variables, making a closure
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
|
|
.. opcode:: BUILD_SLICE (argc)
|
|
|
|
.. index:: pair: built-in function; slice
|
|
|
|
Pushes a slice object on the stack. *argc* must be 2 or 3. If it is 2, implements::
|
|
|
|
end = STACK.pop()
|
|
start = STACK.pop()
|
|
STACK.append(slice(start, stop))
|
|
|
|
if it is 3, implements::
|
|
|
|
step = STACK.pop()
|
|
end = STACK.pop()
|
|
start = STACK.pop()
|
|
STACK.append(slice(start, end, step))
|
|
|
|
See the :func:`slice` built-in function for more information.
|
|
|
|
|
|
.. opcode:: EXTENDED_ARG (ext)
|
|
|
|
Prefixes any opcode which has an argument too big to fit into the default one
|
|
byte. *ext* holds an additional byte which act as higher bits in the argument.
|
|
For each opcode, at most three prefixal ``EXTENDED_ARG`` are allowed, forming
|
|
an argument from two-byte to four-byte.
|
|
|
|
|
|
.. opcode:: CONVERT_VALUE (oparg)
|
|
|
|
Convert value to a string, depending on ``oparg``::
|
|
|
|
value = STACK.pop()
|
|
result = func(value)
|
|
STACK.push(result)
|
|
|
|
* ``oparg == 1``: call :func:`str` on *value*
|
|
* ``oparg == 2``: call :func:`repr` on *value*
|
|
* ``oparg == 3``: call :func:`ascii` on *value*
|
|
|
|
Used for implementing formatted literal strings (f-strings).
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
|
|
.. opcode:: FORMAT_SIMPLE
|
|
|
|
Formats the value on top of stack::
|
|
|
|
value = STACK.pop()
|
|
result = value.__format__("")
|
|
STACK.push(result)
|
|
|
|
Used for implementing formatted literal strings (f-strings).
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
.. opcode:: FORMAT_SPEC
|
|
|
|
Formats the given value with the given format spec::
|
|
|
|
spec = STACK.pop()
|
|
value = STACK.pop()
|
|
result = value.__format__(spec)
|
|
STACK.push(result)
|
|
|
|
Used for implementing formatted literal strings (f-strings).
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
|
|
.. opcode:: MATCH_CLASS (count)
|
|
|
|
``STACK[-1]`` is a tuple of keyword attribute names, ``STACK[-2]`` is the class
|
|
being matched against, and ``STACK[-3]`` is the match subject. *count* is the
|
|
number of positional sub-patterns.
|
|
|
|
Pop ``STACK[-1]``, ``STACK[-2]``, and ``STACK[-3]``. If ``STACK[-3]`` is an
|
|
instance of ``STACK[-2]`` and has the positional and keyword attributes
|
|
required by *count* and ``STACK[-1]``, push a tuple of extracted attributes.
|
|
Otherwise, push ``None``.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
.. versionchanged:: 3.11
|
|
Previously, this instruction also pushed a boolean value indicating
|
|
success (``True``) or failure (``False``).
|
|
|
|
|
|
.. opcode:: RESUME (context)
|
|
|
|
A no-op. Performs internal tracing, debugging and optimization checks.
|
|
|
|
The ``context`` oparand consists of two parts. The lowest two bits
|
|
indicate where the ``RESUME`` occurs:
|
|
|
|
* ``0`` The start of a function, which is neither a generator, coroutine
|
|
nor an async generator
|
|
* ``1`` After a ``yield`` expression
|
|
* ``2`` After a ``yield from`` expression
|
|
* ``3`` After an ``await`` expression
|
|
|
|
The next bit is ``1`` if the RESUME is at except-depth ``1``, and ``0``
|
|
otherwise.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
.. versionchanged:: 3.13
|
|
The oparg value changed to include information about except-depth
|
|
|
|
|
|
.. opcode:: RETURN_GENERATOR
|
|
|
|
Create a generator, coroutine, or async generator from the current frame.
|
|
Used as first opcode of in code object for the above mentioned callables.
|
|
Clear the current frame and return the newly created generator.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: SEND (delta)
|
|
|
|
Equivalent to ``STACK[-1] = STACK[-2].send(STACK[-1])``. Used in ``yield from``
|
|
and ``await`` statements.
|
|
|
|
If the call raises :exc:`StopIteration`, pop the top value from the stack,
|
|
push the exception's ``value`` attribute, and increment the bytecode counter
|
|
by *delta*.
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
|
.. opcode:: HAVE_ARGUMENT
|
|
|
|
This is not really an opcode. It identifies the dividing line between
|
|
opcodes in the range [0,255] which don't use their argument and those
|
|
that do (``< HAVE_ARGUMENT`` and ``>= HAVE_ARGUMENT``, respectively).
|
|
|
|
If your application uses pseudo instructions or specialized instructions,
|
|
use the :data:`hasarg` collection instead.
|
|
|
|
.. versionchanged:: 3.6
|
|
Now every instruction has an argument, but opcodes ``< HAVE_ARGUMENT``
|
|
ignore it. Before, only opcodes ``>= HAVE_ARGUMENT`` had an argument.
|
|
|
|
.. versionchanged:: 3.12
|
|
Pseudo instructions were added to the :mod:`dis` module, and for them
|
|
it is not true that comparison with ``HAVE_ARGUMENT`` indicates whether
|
|
they use their arg.
|
|
|
|
.. deprecated:: 3.13
|
|
Use :data:`hasarg` instead.
|
|
|
|
.. opcode:: CALL_INTRINSIC_1
|
|
|
|
Calls an intrinsic function with one argument. Passes ``STACK[-1]`` as the
|
|
argument and sets ``STACK[-1]`` to the result. Used to implement
|
|
functionality that is not performance critical.
|
|
|
|
The operand determines which intrinsic function is called:
|
|
|
|
+-----------------------------------+-----------------------------------+
|
|
| Operand | Description |
|
|
+===================================+===================================+
|
|
| ``INTRINSIC_1_INVALID`` | Not valid |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_PRINT`` | Prints the argument to standard |
|
|
| | out. Used in the REPL. |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_IMPORT_STAR`` | Performs ``import *`` for the |
|
|
| | named module. |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_STOPITERATION_ERROR`` | Extracts the return value from a |
|
|
| | ``StopIteration`` exception. |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_ASYNC_GEN_WRAP`` | Wraps an aync generator value |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_UNARY_POSITIVE`` | Performs the unary ``+`` |
|
|
| | operation |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_LIST_TO_TUPLE`` | Converts a list to a tuple |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_TYPEVAR`` | Creates a :class:`typing.TypeVar` |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_PARAMSPEC`` | Creates a |
|
|
| | :class:`typing.ParamSpec` |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_TYPEVARTUPLE`` | Creates a |
|
|
| | :class:`typing.TypeVarTuple` |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_SUBSCRIPT_GENERIC`` | Returns :class:`typing.Generic` |
|
|
| | subscripted with the argument |
|
|
+-----------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_TYPEALIAS`` | Creates a |
|
|
| | :class:`typing.TypeAliasType`; |
|
|
| | used in the :keyword:`type` |
|
|
| | statement. The argument is a tuple|
|
|
| | of the type alias's name, |
|
|
| | type parameters, and value. |
|
|
+-----------------------------------+-----------------------------------+
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
.. opcode:: CALL_INTRINSIC_2
|
|
|
|
Calls an intrinsic function with two arguments. Used to implement functionality
|
|
that is not performance critical::
|
|
|
|
arg2 = STACK.pop()
|
|
arg1 = STACK.pop()
|
|
result = intrinsic2(arg1, arg2)
|
|
STACK.push(result)
|
|
|
|
The operand determines which intrinsic function is called:
|
|
|
|
+----------------------------------------+-----------------------------------+
|
|
| Operand | Description |
|
|
+========================================+===================================+
|
|
| ``INTRINSIC_2_INVALID`` | Not valid |
|
|
+----------------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_PREP_RERAISE_STAR`` | Calculates the |
|
|
| | :exc:`ExceptionGroup` to raise |
|
|
| | from a ``try-except*``. |
|
|
+----------------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_TYPEVAR_WITH_BOUND`` | Creates a :class:`typing.TypeVar` |
|
|
| | with a bound. |
|
|
+----------------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_TYPEVAR_WITH_CONSTRAINTS`` | Creates a |
|
|
| | :class:`typing.TypeVar` with |
|
|
| | constraints. |
|
|
+----------------------------------------+-----------------------------------+
|
|
| ``INTRINSIC_SET_FUNCTION_TYPE_PARAMS`` | Sets the ``__type_params__`` |
|
|
| | attribute of a function. |
|
|
+----------------------------------------+-----------------------------------+
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
**Pseudo-instructions**
|
|
|
|
These opcodes do not appear in Python bytecode. They are used by the compiler
|
|
but are replaced by real opcodes or removed before bytecode is generated.
|
|
|
|
.. opcode:: SETUP_FINALLY (target)
|
|
|
|
Set up an exception handler for the following code block. If an exception
|
|
occurs, the value stack level is restored to its current state and control
|
|
is transferred to the exception handler at ``target``.
|
|
|
|
|
|
.. opcode:: SETUP_CLEANUP (target)
|
|
|
|
Like ``SETUP_FINALLY``, but in case of an exception also pushes the last
|
|
instruction (``lasti``) to the stack so that ``RERAISE`` can restore it.
|
|
If an exception occurs, the value stack level and the last instruction on
|
|
the frame are restored to their current state, and control is transferred
|
|
to the exception handler at ``target``.
|
|
|
|
|
|
.. opcode:: SETUP_WITH (target)
|
|
|
|
Like ``SETUP_CLEANUP``, but in case of an exception one more item is popped
|
|
from the stack before control is transferred to the exception handler at
|
|
``target``.
|
|
|
|
This variant is used in :keyword:`with` and :keyword:`async with`
|
|
constructs, which push the return value of the context manager's
|
|
:meth:`~object.__enter__` or :meth:`~object.__aenter__` to the stack.
|
|
|
|
|
|
.. opcode:: POP_BLOCK
|
|
|
|
Marks the end of the code block associated with the last ``SETUP_FINALLY``,
|
|
``SETUP_CLEANUP`` or ``SETUP_WITH``.
|
|
|
|
.. opcode:: JUMP
|
|
.. opcode:: JUMP_NO_INTERRUPT
|
|
|
|
Undirected relative jump instructions which are replaced by their
|
|
directed (forward/backward) counterparts by the assembler.
|
|
|
|
.. opcode:: LOAD_CLOSURE (i)
|
|
|
|
Pushes a reference to the cell contained in slot ``i`` of the "fast locals"
|
|
storage.
|
|
|
|
Note that ``LOAD_CLOSURE`` is replaced with ``LOAD_FAST`` in the assembler.
|
|
|
|
.. versionchanged:: 3.13
|
|
This opcode is now a pseudo-instruction.
|
|
|
|
|
|
.. opcode:: LOAD_METHOD
|
|
|
|
Optimized unbound method lookup. Emitted as a ``LOAD_ATTR`` opcode
|
|
with a flag set in the arg.
|
|
|
|
|
|
.. _opcode_collections:
|
|
|
|
Opcode collections
|
|
------------------
|
|
|
|
These collections are provided for automatic introspection of bytecode
|
|
instructions:
|
|
|
|
.. versionchanged:: 3.12
|
|
The collections now contain pseudo instructions and instrumented
|
|
instructions as well. These are opcodes with values ``>= MIN_PSEUDO_OPCODE``
|
|
and ``>= MIN_INSTRUMENTED_OPCODE``.
|
|
|
|
.. data:: opname
|
|
|
|
Sequence of operation names, indexable using the bytecode.
|
|
|
|
|
|
.. data:: opmap
|
|
|
|
Dictionary mapping operation names to bytecodes.
|
|
|
|
|
|
.. data:: cmp_op
|
|
|
|
Sequence of all compare operation names.
|
|
|
|
|
|
.. data:: hasarg
|
|
|
|
Sequence of bytecodes that use their argument.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. data:: hasconst
|
|
|
|
Sequence of bytecodes that access a constant.
|
|
|
|
|
|
.. data:: hasfree
|
|
|
|
Sequence of bytecodes that access a free variable. 'free' in this
|
|
context refers to names in the current scope that are referenced by inner
|
|
scopes or names in outer scopes that are referenced from this scope. It does
|
|
*not* include references to global or builtin scopes.
|
|
|
|
|
|
.. data:: hasname
|
|
|
|
Sequence of bytecodes that access an attribute by name.
|
|
|
|
|
|
.. data:: hasjump
|
|
|
|
Sequence of bytecodes that have a jump target. All jumps
|
|
are relative.
|
|
|
|
.. versionadded:: 3.13
|
|
|
|
.. data:: haslocal
|
|
|
|
Sequence of bytecodes that access a local variable.
|
|
|
|
|
|
.. data:: hascompare
|
|
|
|
Sequence of bytecodes of Boolean operations.
|
|
|
|
.. data:: hasexc
|
|
|
|
Sequence of bytecodes that set an exception handler.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. data:: hasjrel
|
|
|
|
Sequence of bytecodes that have a relative jump target.
|
|
|
|
.. deprecated:: 3.13
|
|
All jumps are now relative. Use :data:`hasjump`.
|
|
|
|
|
|
.. data:: hasjabs
|
|
|
|
Sequence of bytecodes that have an absolute jump target.
|
|
|
|
.. deprecated:: 3.13
|
|
All jumps are now relative. This list is empty.
|
|
|