bpo-17611. Move unwinding of stack for "pseudo exceptions" from inter… · python/cpython@520b7ae

@@ -335,6 +335,14 @@ The Python compiler currently generates the following bytecode instructions.

335335

three.

336336337337338+

.. opcode:: ROT_FOUR

339+340+

Lifts second, third and forth stack items one position up, moves top down

341+

to position four.

342+343+

.. versionadded:: 3.8

344+345+338346

.. opcode:: DUP_TOP

339347340348

Duplicates the reference on top of the stack.

@@ -605,17 +613,6 @@ the original TOS1.

605613

is terminated with :opcode:`POP_TOP`.

606614607615608-

.. opcode:: BREAK_LOOP

609-610-

Terminates a loop due to a :keyword:`break` statement.

611-612-613-

.. opcode:: CONTINUE_LOOP (target)

614-615-

Continues a loop due to a :keyword:`continue` statement. *target* is the

616-

address to jump to (which should be a :opcode:`FOR_ITER` instruction).

617-618-619616

.. opcode:: SET_ADD (i)

620617621618

Calls ``set.add(TOS1[-i], TOS)``. Used to implement set comprehensions.

@@ -676,7 +673,7 @@ iterations of the loop.

676673

.. opcode:: POP_BLOCK

677674678675

Removes one block from the block stack. Per frame, there is a stack of

679-

blocks, denoting nested loops, try statements, and such.

676+

blocks, denoting :keyword:`try` statements, and such.

680677681678682679

.. opcode:: POP_EXCEPT

@@ -687,11 +684,50 @@ iterations of the loop.

687684

popped values are used to restore the exception state.

688685689686687+

.. opcode:: POP_FINALLY (preserve_tos)

688+689+

Cleans up the value stack and the block stack. If *preserve_tos* is not

690+

``0`` TOS first is popped from the stack and pushed on the stack after

691+

perfoming other stack operations:

692+693+

* If TOS is ``NULL`` or an integer (pushed by :opcode:`BEGIN_FINALLY`

694+

or :opcode:`CALL_FINALLY`) it is popped from the stack.

695+

* If TOS is an exception type (pushed when an exception has been raised)

696+

6 values are popped from the stack, the last three popped values are

697+

used to restore the exception state. An exception handler block is

698+

removed from the block stack.

699+700+

It is similar to :opcode:`END_FINALLY`, but doesn't change the bytecode

701+

counter nor raise an exception. Used for implementing :keyword:`break`

702+

and :keyword:`return` in the :keyword:`finally` block.

703+704+

.. versionadded:: 3.8

705+706+707+

.. opcode:: BEGIN_FINALLY

708+709+

Pushes ``NULL`` onto the stack for using it in :opcode:`END_FINALLY`,

710+

:opcode:`POP_FINALLY`, :opcode:`WITH_CLEANUP_START` and

711+

:opcode:`WITH_CLEANUP_FINISH`. Starts the :keyword:`finally` block.

712+713+

.. versionadded:: 3.8

714+715+690716

.. opcode:: END_FINALLY

691717692718

Terminates a :keyword:`finally` clause. The interpreter recalls whether the

693-

exception has to be re-raised, or whether the function returns, and continues

694-

with the outer-next block.

719+

exception has to be re-raised or execution has to be continued depending on

720+

the value of TOS.

721+722+

* If TOS is ``NULL`` (pushed by :opcode:`BEGIN_FINALLY`) continue from

723+

the next instruction. TOS is popped.

724+

* If TOS is an integer (pushed by :opcode:`CALL_FINALLY`), sets the

725+

bytecode counter to TOS. TOS is popped.

726+

* If TOS is an exception type (pushed when an exception has been raised)

727+

6 values are popped from the stack, the first three popped values are

728+

used to re-raise the exception and the last three popped values are used

729+

to restore the exception state. An exception handler block is removed

730+

from the block stack.

695731696732697733

.. opcode:: LOAD_BUILD_CLASS

@@ -704,9 +740,9 @@ iterations of the loop.

704740705741

This opcode performs several operations before a with block starts. First,

706742

it loads :meth:`~object.__exit__` from the context manager and pushes it onto

707-

the stack for later use by :opcode:`WITH_CLEANUP`. Then,

743+

the stack for later use by :opcode:`WITH_CLEANUP_START`. Then,

708744

:meth:`~object.__enter__` is called, and a finally block pointing to *delta*

709-

is pushed. Finally, the result of calling the enter method is pushed onto

745+

is pushed. Finally, the result of calling the ``__enter__()`` method is pushed onto

710746

the stack. The next opcode will either ignore it (:opcode:`POP_TOP`), or

711747

store it in (a) variable(s) (:opcode:`STORE_FAST`, :opcode:`STORE_NAME`, or

712748

:opcode:`UNPACK_SEQUENCE`).

@@ -716,30 +752,31 @@ iterations of the loop.

716752717753

.. opcode:: WITH_CLEANUP_START

718754719-

Cleans up the stack when a :keyword:`with` statement block exits. TOS is the

720-

context manager's :meth:`__exit__` bound method. Below TOS are 1--3 values

721-

indicating how/why the finally clause was entered:

755+

Starts cleaning up the stack when a :keyword:`with` statement block exits.

722756723-

* SECOND = ``None``

724-

* (SECOND, THIRD) = (``WHY_{RETURN,CONTINUE}``), retval

725-

* SECOND = ``WHY_*``; no retval below it

726-

* (SECOND, THIRD, FOURTH) = exc_info()

757+

At the top of the stack are either ``NULL`` (pushed by

758+

:opcode:`BEGIN_FINALLY`) or 6 values pushed if an exception has been

759+

raised in the with block. Below is the context manager's

760+

:meth:`~object.__exit__` or :meth:`~object.__aexit__` bound method.

727761728-

In the last case, ``TOS(SECOND, THIRD, FOURTH)`` is called, otherwise

729-

``TOS(None, None, None)``. Pushes SECOND and result of the call

730-

to the stack.

762+

If TOS is ``NULL``, calls ``SECOND(None, None, None)``,

763+

removes the function from the stack, leaving TOS, and pushes ``None``

764+

to the stack. Otherwise calls ``SEVENTH(TOP, SECOND, THIRD)``,

765+

shifts the bottom 3 values of the stack down, replaces the empty spot

766+

with ``NULL`` and pushes TOS. Finally pushes the result of the call.

731767732768733769

.. opcode:: WITH_CLEANUP_FINISH

734770735-

Pops exception type and result of 'exit' function call from the stack.

771+

Finishes cleaning up the stack when a :keyword:`with` statement block exits.

736772737-

If the stack represents an exception, *and* the function call returns a

738-

'true' value, this information is "zapped" and replaced with a single

739-

``WHY_SILENCED`` to prevent :opcode:`END_FINALLY` from re-raising the

740-

exception. (But non-local gotos will still be resumed.)

773+

TOS is result of ``__exit__()`` or ``__aexit__()`` function call pushed

774+

by :opcode:`WITH_CLEANUP_START`. SECOND is ``None`` or an exception type

775+

(pushed when an exception has been raised).

741776742-

.. XXX explain the WHY stuff!

777+

Pops two values from the stack. If SECOND is not None and TOS is true

778+

unwinds the EXCEPT_HANDLER block which was created when the exception

779+

was caught and pushes ``NULL`` to the stack.

743780744781745782

All of the following opcodes use their arguments.

@@ -987,22 +1024,19 @@ All of the following opcodes use their arguments.

9871024

Loads the global named ``co_names[namei]`` onto the stack.

98810259891026990-

.. opcode:: SETUP_LOOP (delta)

991-992-

Pushes a block for a loop onto the block stack. The block spans from the

993-

current instruction with a size of *delta* bytes.

994-1027+

.. opcode:: SETUP_FINALLY (delta)

9951028996-

.. opcode:: SETUP_EXCEPT (delta)

1029+

Pushes a try block from a try-finally or try-except clause onto the block

1030+

stack. *delta* points to the finally block or the first except block.

9971031998-

Pushes a try block from a try-except clause onto the block stack. *delta*

999-

points to the first except block.

100010321033+

.. opcode:: CALL_FINALLY (delta)

100110341002-

.. opcode:: SETUP_FINALLY (delta)

1035+

Pushes the address of the next instruction onto the stack and increments

1036+

bytecode counter by *delta*. Used for calling the finally block as a

1037+

"subroutine".

100310381004-

Pushes a try block from a try-except clause onto the block stack. *delta*

1005-

points to the finally block.

1039+

.. versionadded:: 3.8

100610401007104110081042

.. opcode:: LOAD_FAST (var_num)