A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/python/cpython/commit/520b7ae27e39d1c77ea74ccd1b184d7cb43f9dcb below:

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

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

335 335

three.

336 336 337 337 338 +

.. 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 + 338 346

.. opcode:: DUP_TOP

339 347 340 348

Duplicates the reference on top of the stack.

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

605 613

is terminated with :opcode:`POP_TOP`.

606 614 607 615 608 -

.. 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 - 619 616

.. opcode:: SET_ADD (i)

620 617 621 618

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

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

676 673

.. opcode:: POP_BLOCK

677 674 678 675

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.

680 677 681 678 682 679

.. opcode:: POP_EXCEPT

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

687 684

popped values are used to restore the exception state.

688 685 689 686 687 +

.. 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 + 690 716

.. opcode:: END_FINALLY

691 717 692 718

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.

695 731 696 732 697 733

.. opcode:: LOAD_BUILD_CLASS

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

704 740 705 741

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

706 742

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,

708 744

: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

710 746

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

711 747

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

712 748

:opcode:`UNPACK_SEQUENCE`).

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

716 752 717 753

.. opcode:: WITH_CLEANUP_START

718 754 719 -

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.

722 756 723 -

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

727 761 728 -

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.

731 767 732 768 733 769

.. opcode:: WITH_CLEANUP_FINISH

734 770 735 -

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.

736 772 737 -

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

741 776 742 -

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

743 780 744 781 745 782

All of the following opcodes use their arguments.

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

987 1024

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

988 1025 989 1026 990 -

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

995 1028 996 -

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

997 1031 998 -

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

999 -

points to the first except block.

1000 1032 1033 +

.. opcode:: CALL_FINALLY (delta)

1001 1034 1002 -

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

1003 1038 1004 -

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

1005 -

points to the finally block.

1039 +

.. versionadded:: 3.8

1006 1040 1007 1041 1008 1042

.. opcode:: LOAD_FAST (var_num)


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4