@@ -1481,58 +1481,100 @@ contributors are volunteers from the community.
1481
1481
CPython bytecode changes
1482
1482
========================
1483
1483
1484
- * The bytecode now contains inline cache entries, which take the form of
1485
- :opcode: `CACHE ` instructions. Many opcodes expect to be followed by an exact
1486
- number of caches, and instruct the interpreter to skip over them at runtime.
1487
- Populated caches can look like arbitrary instructions, so great care should be
1488
- taken when reading or modifying raw, adaptive bytecode containing quickened
1489
- data.
1484
+ The bytecode now contains inline cache entries,
1485
+ which take the form of the newly-added :opcode: `CACHE ` instructions.
1486
+ Many opcodes expect to be followed by an exact number of caches,
1487
+ and instruct the interpreter to skip over them at runtime.
1488
+ Populated caches can look like arbitrary instructions,
1489
+ so great care should be taken when reading or modifying
1490
+ raw, adaptive bytecode containing quickened data.
1490
1491
1491
- * Replaced all numeric ``BINARY_* `` and ``INPLACE_* `` instructions with a single
1492
- :opcode: `BINARY_OP ` implementation.
1493
1492
1494
- * Replaced the three call instructions: :opcode: `CALL_FUNCTION `,
1495
- :opcode: `CALL_FUNCTION_KW ` and :opcode: `CALL_METHOD ` with
1496
- :opcode: `PUSH_NULL `, :opcode: `PRECALL `, :opcode: `CALL `,
1497
- and :opcode: `KW_NAMES `.
1498
- This decouples the argument shifting for methods from the handling of
1499
- keyword arguments and allows better specialization of calls.
1493
+ .. _whatsnew311-added-opcodes :
1500
1494
1501
- * Removed ``COPY_DICT_WITHOUT_KEYS `` and ``GEN_START ``.
1495
+ New opcodes
1496
+ -----------
1497
+
1498
+ * :opcode: `ASYNC_GEN_WRAP `, :opcode: `RETURN_GENERATOR ` and :opcode: `SEND `,
1499
+ used in generators and co-routines.
1502
1500
1503
- * :opcode: `MATCH_CLASS ` and :opcode: `MATCH_KEYS ` no longer push an additional
1504
- boolean value indicating whether the match succeeded or failed. Instead, they
1505
- indicate failure with :const: `None ` (where a tuple of extracted values would
1506
- otherwise be).
1501
+ * :opcode: `COPY_FREE_VARS `,
1502
+ which avoids needing special caller-side code for closures.
1507
1503
1508
- * Replace several stack manipulation instructions (``DUP_TOP ``, ``DUP_TOP_TWO ``,
1509
- ``ROT_TWO ``, ``ROT_THREE ``, ``ROT_FOUR ``, and ``ROT_N ``) with new
1510
- :opcode: `COPY ` and :opcode: `SWAP ` instructions.
1504
+ * :opcode: `JUMP_BACKWARD_NO_INTERRUPT `,
1505
+ for use in certain loops where handling interrupts is undesirable.
1511
1506
1512
- * Replaced :opcode: `JUMP_IF_NOT_EXC_MATCH ` by :opcode: `CHECK_EXC_MATCH ` which
1513
- performs the check but does not jump.
1507
+ * :opcode: `MAKE_CELL `, to create :ref: `cell-objects `.
1514
1508
1515
- * Replaced :opcode: `JUMP_IF_NOT_EG_MATCH ` by :opcode: `CHECK_EG_MATCH ` which
1516
- performs the check but does not jump.
1509
+ * :opcode: `CHECK_EG_MATCH ` and :opcode: `PREP_RERAISE_STAR `,
1510
+ to handle the :ref: `new exception groups and except* <whatsnew311-pep654 >`
1511
+ added in :pep: `654 `.
1517
1512
1518
- * Replaced :opcode: `JUMP_ABSOLUTE ` by the relative :opcode: ` JUMP_BACKWARD ` .
1513
+ * :opcode: `PUSH_EXC_INFO `, for use in exception handlers .
1519
1514
1520
- * Added :opcode: `JUMP_BACKWARD_NO_INTERRUPT `, which is used in certain loops where it
1521
- is undesirable to handle interrupts .
1515
+ * :opcode: `RESUME `, a no-op,
1516
+ for internal tracing, debugging and optimization checks .
1522
1517
1523
- * Replaced :opcode: `POP_JUMP_IF_TRUE ` and :opcode: `POP_JUMP_IF_FALSE ` by
1524
- the relative :opcode: `POP_JUMP_FORWARD_IF_TRUE `, :opcode: `POP_JUMP_BACKWARD_IF_TRUE `,
1525
- :opcode: `POP_JUMP_FORWARD_IF_FALSE ` and :opcode: `POP_JUMP_BACKWARD_IF_FALSE `.
1526
1518
1527
- * Added :opcode: `POP_JUMP_FORWARD_IF_NOT_NONE `, :opcode: `POP_JUMP_BACKWARD_IF_NOT_NONE `,
1528
- :opcode: `POP_JUMP_FORWARD_IF_NONE ` and :opcode: `POP_JUMP_BACKWARD_IF_NONE `
1529
- opcodes to speed up conditional jumps.
1519
+ .. _whatsnew311-replaced-opcodes :
1530
1520
1531
- * :opcode: ` JUMP_IF_TRUE_OR_POP ` and :opcode: ` JUMP_IF_FALSE_OR_POP ` are now
1532
- relative rather than absolute.
1521
+ Replaced opcodes
1522
+ ----------------
1533
1523
1534
- * :opcode: `RESUME ` has been added. It is a no-op. Performs internal tracing,
1535
- debugging and optimization checks.
1524
+ +------------------------------------+-----------------------------------+-----------------------------------------+
1525
+ | Replaced Opcode(s) | New Opcode(s) | Notes |
1526
+ +====================================+===================================+=========================================+
1527
+ | | :opcode: `!BINARY_* ` | :opcode: `BINARY_OP ` | Replaced all numeric binary/in-place |
1528
+ | | :opcode: `!INPLACE_* ` | | opcodes with a single opcode |
1529
+ +------------------------------------+-----------------------------------+-----------------------------------------+
1530
+ | | :opcode: `!CALL_FUNCTION ` | | :opcode: `CALL ` | Decouples argument shifting for methods |
1531
+ | | :opcode: `!CALL_FUNCTION_KW ` | | :opcode: `KW_NAMES ` | from handling of keyword arguments; |
1532
+ | | :opcode: `!CALL_METHOD ` | | :opcode: `PRECALL ` | allows better specialization of calls |
1533
+ | | | :opcode: `PUSH_NULL ` | |
1534
+ +------------------------------------+-----------------------------------+-----------------------------------------+
1535
+ | | :opcode: `!DUP_TOP ` | | :opcode: `COPY ` | Stack manipulation instructions |
1536
+ | | :opcode: `!DUP_TOP_TWO ` | | :opcode: `SWAP ` | |
1537
+ | | :opcode: `!ROT_TWO ` | | |
1538
+ | | :opcode: `!ROT_THREE ` | | |
1539
+ | | :opcode: `!ROT_FOUR ` | | |
1540
+ | | :opcode: `!ROT_N ` | | |
1541
+ +------------------------------------+-----------------------------------+-----------------------------------------+
1542
+ | | :opcode: `!JUMP_IF_NOT_EXC_MATCH ` | | :opcode: `CHECK_EXC_MATCH ` | Now performs check but doesn't jump |
1543
+ +------------------------------------+-----------------------------------+-----------------------------------------+
1544
+ | | :opcode: `!JUMP_ABSOLUTE ` | | :opcode: `JUMP_BACKWARD ` | See [#bytecode-jump ]_; |
1545
+ | | :opcode: `!POP_JUMP_IF_FALSE ` | | :opcode: `POP_JUMP_BACKWARD_IF_* | ``TRUE ``, ``FALSE ``, |
1546
+ | | :opcode: `!POP_JUMP_IF_TRUE ` | <POP_JUMP_BACKWARD_IF_TRUE>` | ``NONE `` and ``NOT_NONE `` variants |
1547
+ | | | :opcode: `POP_JUMP_FORWARD_IF_* | for each direction |
1548
+ | | <POP_JUMP_FORWARD_IF_TRUE>` | |
1549
+ +------------------------------------+-----------------------------------+-----------------------------------------+
1550
+ | | :opcode: `!SETUP_WITH ` | :opcode: `BEFORE_WITH ` | :keyword: `with ` block setup |
1551
+ | | :opcode: `!SETUP_ASYNC_WITH ` | | |
1552
+ +------------------------------------+-----------------------------------+-----------------------------------------+
1553
+
1554
+ .. [#bytecode-jump ] All jump opcodes are now relative, including the
1555
+ existing :opcode: `JUMP_IF_TRUE_OR_POP ` and :opcode: `JUMP_IF_FALSE_OR_POP `.
1556
+ The argument is now an offset from the current instruction
1557
+ rather than an absolute location.
1558
+
1559
+
1560
+ .. _whatsnew311-changed-opcodes :
1561
+ .. _whatsnew311-removed-opcodes :
1562
+ .. _whatsnew311-changed-removed-opcodes :
1563
+
1564
+ Changed/removed opcodes
1565
+ -----------------------
1566
+
1567
+ * Changed :opcode: `MATCH_CLASS ` and :opcode: `MATCH_KEYS `
1568
+ to no longer push an additional boolean value to indicate success/failure.
1569
+ Instead, ``None `` is pushed on failure
1570
+ in place of the tuple of extracted values.
1571
+
1572
+ * Changed opcodes that work with exceptions to reflect them
1573
+ now being represented as one item on the stack instead of three
1574
+ (see :gh: `89874 `).
1575
+
1576
+ * Removed :opcode: `!COPY_DICT_WITHOUT_KEYS `, :opcode: `!GEN_START `,
1577
+ :opcode: `!POP_BLOCK `, :opcode: `!SETUP_FINALLY ` and :opcode: `!YIELD_FROM `.
1536
1578
1537
1579
1538
1580
.. _whatsnew311-deprecated :
0 commit comments