| :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``. |
| |
| |
| 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 0 RESUME 0 |
| <BLANKLINE> |
| 3 2 LOAD_GLOBAL 1 (len + NULL) |
| 12 LOAD_FAST 0 (alist) |
| 14 CALL 1 |
| 22 RETURN_VALUE |
| |
| (The "2" is a line number). |
| |
| 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) |
| |
| 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. |
| |
| .. 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) |
| |
| 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. |
| |
| |
| .. function:: disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False) |
| disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=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. |
| |
| |
| .. 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 *show_caches* and *adaptive* parameters work as they do in :func:`dis`. |
| |
| .. versionadded:: 3.4 |
| |
| .. versionchanged:: 3.11 |
| Added the *show_caches* and *adaptive* parameters. |
| |
| |
| .. function:: findlinestarts(code) |
| |
| This generator function uses the ``co_lines`` method |
| of the code object *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` ``co_lines`` method is used instead of the ``co_firstlineno`` |
| and ``co_lnotab`` attributes of the code object. |
| |
| .. 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. |
| |
| .. 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``, and |
| ``line_number``. |
| |
| |
| .. 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 two values from the stack. |
| Equivalent to ``POP_TOP``; ``POP_TOP``. |
| Used to clean up at the end of loops, hence the name. |
| |
| .. 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[index]) |
| |
| |
| .. 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. |
| |
| |
| .. 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 ``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:`!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:`!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:`!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:`!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` |
| 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` (e.g. ``super().method()`` and |
| ``super().attr``). It works the same as :opcode:`LOAD_ATTR`, except that |
| ``namei`` is shifted left by 2 bits instead of 1, and instead of expecting a |
| single receiver on the stack, it expects three objects (from top of stack |
| down): ``self`` (the first argument to the current method), ``cls`` (the |
| class within which the current method was defined), and the global ``super``. |
| |
| The low bit of ``namei`` signals to attempt a method load, as with |
| :opcode:`LOAD_ATTR`. |
| |
| 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 ``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 ``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 ``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``, |
| including the named arguments specified by the preceding |
| :opcode:`KW_NAMES`, if any. |
| On the stack are (in ascending order), either: |
| |
| * NULL |
| * The callable |
| * The positional arguments |
| * The named arguments |
| |
| or: |
| |
| * The callable |
| * ``self`` |
| * The remaining positional arguments |
| * The named arguments |
| |
| ``argc`` is the total of the positional and named arguments, excluding |
| ``self`` when a ``NULL`` is not present. |
| |
| ``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 |
| |
| |
| .. 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:: KW_NAMES (consti) |
| |
| Prefixes :opcode:`CALL`. |
| Stores a reference to ``co_consts[consti]`` into an internal variable |
| for use by :opcode:`CALL`. ``co_consts[consti]`` must be a tuple of strings. |
| |
| .. 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 (where) |
| |
| A no-op. Performs internal tracing, debugging and optimization checks. |
| |
| The ``where`` operand marks 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 |
| |
| .. versionadded:: 3.11 |
| |
| |
| .. 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 both items, 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, 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. |
| |
| |
| .. 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 necessary but 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. Passes ``STACK[-2]``, ``STACK[-1]`` as the |
| arguments and sets ``STACK[-1]`` to the result. Used to implement functionality that is |
| necessary but not performance critical. |
| |
| 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 as well. These are |
| opcodes with values ``>= MIN_PSEUDO_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. |
| |