Skip to content

Commit

Permalink
gh-107457: update dis documentation with changes in 3.12 (#108900)
Browse files Browse the repository at this point in the history
  • Loading branch information
MatthieuDartiailh authored Oct 17, 2023
1 parent 24e4ec7 commit 198aa67
Showing 1 changed file with 43 additions and 16 deletions.
59 changes: 43 additions & 16 deletions Doc/library/dis.rst
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ interpreter.
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.

Example: Given the function :func:`!myfunc`::

Expand Down Expand Up @@ -513,6 +521,14 @@ operations on it as if it was a Python list. The top of the stack corresponds to
.. 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
Expand Down Expand Up @@ -1159,15 +1175,21 @@ iterations of the loop.

.. 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``.
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`.
: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).
Expand Down Expand Up @@ -1632,9 +1654,9 @@ iterations of the loop.
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*.
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

Expand Down Expand Up @@ -1664,7 +1686,7 @@ iterations of the loop.

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.
functionality that is not performance critical.

The operand determines which intrinsic function is called:

Expand Down Expand Up @@ -1712,9 +1734,13 @@ iterations of the loop.

.. 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.
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:

Expand Down Expand Up @@ -1810,8 +1836,9 @@ 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``.
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

Expand Down

0 comments on commit 198aa67

Please sign in to comment.