https://github.com/python/cpython/commit/fe23f8ed970425828de20fb48750fa89da914886
commit: fe23f8ed970425828de20fb48750fa89da914886
branch: main
author: Mark Shannon <m...@hotpy.org>
committer: markshannon <m...@hotpy.org>
date: 2024-08-13T10:25:44+01:00
summary:

GH-122821: Simplify compilation of while statements to ensure consistency of 
offsets for sys.monitoring (GH-122934)

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2024-08-12-11-45-47.gh-issue-122821.WnAzTK.rst
M Include/internal/pycore_magic_number.h
M Lib/test/test_capi/test_opt.py
M Lib/test/test_dis.py
M Lib/test/test_monitoring.py
M Python/compile.c

diff --git a/Include/internal/pycore_magic_number.h 
b/Include/internal/pycore_magic_number.h
index 3af6817e9fde85..249314fff55a16 100644
--- a/Include/internal/pycore_magic_number.h
+++ b/Include/internal/pycore_magic_number.h
@@ -255,6 +255,7 @@ Known values:
     Python 3.14a1 3601 (Fix miscompilation of private names in generic classes)
     Python 3.14a1 3602 (Add LOAD_SPECIAL. Remove BEFORE_WITH and 
BEFORE_ASYNC_WITH)
     Python 3.14a1 3603 (Remove BUILD_CONST_KEY_MAP)
+    Python 3.14a1 3604 (Do not duplicate test at end of while statements)
 
     Python 3.15 will start with 3650
 
@@ -267,7 +268,7 @@ PC/launcher.c must also be updated.
 
 */
 
-#define PYC_MAGIC_NUMBER 3603
+#define PYC_MAGIC_NUMBER 3604
 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
    (little-endian) and then appending b'\r\n'. */
 #define PYC_MAGIC_NUMBER_TOKEN \
diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py
index 81544f5b8afc6e..f1ab72180d714d 100644
--- a/Lib/test/test_capi/test_opt.py
+++ b/Lib/test/test_capi/test_opt.py
@@ -274,6 +274,7 @@ def many_vars():
                 z0 = z1 = z2 = z3 = z4 = z5 = z6 = z7 = z8 = z9 = 42
                 while z9 > 0:
                     z9 = z9 - 1
+                    +z9
         """), ns, ns)
         many_vars = ns["many_vars"]
 
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index c8defde7b99ec7..a895642087dfa7 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -381,14 +381,13 @@ def wrap_func_w_kwargs():
   1           LOAD_CONST               0 (0)
               STORE_NAME               0 (x)
 
-  2           NOP
+  2   L1:     NOP
 
-  3   L1:     LOAD_NAME                0 (x)
+  3           LOAD_NAME                0 (x)
               LOAD_CONST               1 (1)
               BINARY_OP               13 (+=)
               STORE_NAME               0 (x)
-
-  2           JUMP_BACKWARD            7 (to L1)
+              JUMP_BACKWARD            8 (to L1)
 """
 
 dis_traceback = """\
@@ -1704,8 +1703,8 @@ def _prepare_test_cases():
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=112, start_offset=112, starts_line=False, line_number=10, label=None, 
positions=None, cache_info=None),
   Instruction(opname='LOAD_FAST_CHECK', opcode=84, arg=0, argval='i', 
argrepr='i', offset=114, start_offset=114, starts_line=True, line_number=11, 
label=5, positions=None, cache_info=None),
   Instruction(opname='TO_BOOL', opcode=37, arg=None, argval=None, argrepr='', 
offset=116, start_offset=116, starts_line=False, line_number=11, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=40, argval=208, 
argrepr='to L9', offset=124, start_offset=124, starts_line=False, 
line_number=11, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=128, start_offset=128, starts_line=True, 
line_number=12, label=6, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=33, argval=194, 
argrepr='to L8', offset=124, start_offset=124, starts_line=False, 
line_number=11, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=128, start_offset=128, starts_line=True, 
line_number=12, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
   Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=138, start_offset=138, starts_line=False, line_number=12, label=None, 
positions=None, cache_info=None),
   Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=140, start_offset=140, starts_line=False, line_number=12, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
   Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=148, start_offset=148, starts_line=False, line_number=12, label=None, 
positions=None, cache_info=None),
@@ -1716,86 +1715,83 @@ def _prepare_test_cases():
   Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=160, start_offset=160, starts_line=True, line_number=14, label=None, 
positions=None, cache_info=None),
   Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=6, argrepr='6', 
offset=162, start_offset=162, starts_line=False, line_number=14, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COMPARE_OP', opcode=54, arg=148, argval='>', 
argrepr='bool(>)', offset=164, start_offset=164, starts_line=False, 
line_number=14, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=2, argval=176, 
argrepr='to L7', offset=168, start_offset=168, starts_line=False, 
line_number=14, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=2, argval=176, 
argrepr='to L6', offset=168, start_offset=168, starts_line=False, 
line_number=14, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
   Instruction(opname='JUMP_BACKWARD', opcode=73, arg=31, argval=114, 
argrepr='to L5', offset=172, start_offset=172, starts_line=True, 
line_number=15, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=176, start_offset=176, starts_line=True, line_number=16, label=7, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=176, start_offset=176, starts_line=True, line_number=16, label=6, 
positions=None, cache_info=None),
   Instruction(opname='LOAD_CONST', opcode=80, arg=2, argval=4, argrepr='4', 
offset=178, start_offset=178, starts_line=False, line_number=16, label=None, 
positions=None, cache_info=None),
   Instruction(opname='COMPARE_OP', opcode=54, arg=18, argval='<', 
argrepr='bool(<)', offset=180, start_offset=180, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=1, argval=190, 
argrepr='to L8', offset=184, start_offset=184, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='JUMP_FORWARD', opcode=75, arg=20, argval=230, 
argrepr='to L10', offset=188, start_offset=188, starts_line=True, 
line_number=17, label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=190, start_offset=190, starts_line=True, line_number=11, label=8, 
positions=None, cache_info=None),
-  Instruction(opname='TO_BOOL', opcode=37, arg=None, argval=None, argrepr='', 
offset=192, start_offset=192, starts_line=False, line_number=11, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=2, argval=208, 
argrepr='to L9', offset=200, start_offset=200, starts_line=False, 
line_number=11, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='JUMP_BACKWARD', opcode=73, arg=40, argval=128, 
argrepr='to L6', offset=204, start_offset=204, starts_line=False, 
line_number=11, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=208, start_offset=208, starts_line=True, 
line_number=19, label=9, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=6, argval='Who let lolcatz 
into this test suite?', argrepr="'Who let lolcatz into this test suite?'", 
offset=218, start_offset=218, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=220, start_offset=220, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=228, start_offset=228, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='NOP', opcode=27, arg=None, argval=None, argrepr='', 
offset=230, start_offset=230, starts_line=True, line_number=20, label=10, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=5, argval=1, argrepr='1', 
offset=232, start_offset=232, starts_line=True, line_number=21, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=7, argval=0, argrepr='0', 
offset=234, start_offset=234, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='BINARY_OP', opcode=42, arg=11, argval=11, argrepr='/', 
offset=236, start_offset=236, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=240, start_offset=240, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=242, start_offset=242, starts_line=True, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='COPY', opcode=57, arg=1, argval=1, argrepr='', 
offset=244, start_offset=244, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_SPECIAL', opcode=90, arg=1, argval=1, 
argrepr='__exit__', offset=246, start_offset=246, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='SWAP', opcode=113, arg=2, argval=2, argrepr='', 
offset=248, start_offset=248, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='SWAP', opcode=113, arg=3, argval=3, argrepr='', 
offset=250, start_offset=250, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_SPECIAL', opcode=90, arg=0, argval=0, 
argrepr='__enter__', offset=252, start_offset=252, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='CALL', opcode=49, arg=0, argval=0, argrepr='', 
offset=254, start_offset=254, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='STORE_FAST', opcode=108, arg=1, argval='dodgy', 
argrepr='dodgy', offset=262, start_offset=262, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=264, start_offset=264, starts_line=True, 
line_number=26, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=8, argval='Never reach 
this', argrepr="'Never reach this'", offset=274, start_offset=274, 
starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
-  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=276, start_offset=276, starts_line=False, line_number=26, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=284, start_offset=284, starts_line=False, line_number=26, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=286, start_offset=286, starts_line=True, line_number=25, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=288, start_offset=288, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=290, start_offset=290, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='CALL', opcode=49, arg=3, argval=3, argrepr='', 
offset=292, start_offset=292, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=300, start_offset=300, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=302, start_offset=302, starts_line=True, 
line_number=28, label=11, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=312, start_offset=312, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
-  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=314, start_offset=314, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=322, start_offset=322, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='RETURN_CONST', opcode=101, arg=0, argval=None, 
argrepr='None', offset=324, start_offset=324, starts_line=False, 
line_number=28, label=None, positions=None, cache_info=None),
-  Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=326, start_offset=326, starts_line=True, line_number=25, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='WITH_EXCEPT_START', opcode=41, arg=None, argval=None, 
argrepr='', offset=328, start_offset=328, starts_line=False, line_number=25, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='TO_BOOL', opcode=37, arg=None, argval=None, argrepr='', 
offset=330, start_offset=330, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_JUMP_IF_TRUE', opcode=98, arg=1, argval=344, 
argrepr='to L12', offset=338, start_offset=338, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='RERAISE', opcode=100, arg=2, argval=2, argrepr='', 
offset=342, start_offset=342, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=344, start_offset=344, starts_line=False, line_number=25, label=12, 
positions=None, cache_info=None),
-  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=346, start_offset=346, starts_line=False, line_number=25, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=348, start_offset=348, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=350, start_offset=350, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=352, start_offset=352, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=27, 
argval=302, argrepr='to L11', offset=354, start_offset=354, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
-  Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=356, start_offset=356, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=358, start_offset=358, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=360, start_offset=360, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=362, start_offset=362, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=4, 
argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=364, 
start_offset=364, starts_line=True, line_number=22, label=None, positions=None, 
cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), 
('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, 
b'\x00\x00')]),
-  Instruction(opname='CHECK_EXC_MATCH', opcode=5, arg=None, argval=None, 
argrepr='', offset=374, start_offset=374, starts_line=False, line_number=22, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=14, argval=408, 
argrepr='to L13', offset=376, start_offset=376, starts_line=False, 
line_number=22, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=380, start_offset=380, starts_line=False, line_number=22, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=382, start_offset=382, starts_line=True, 
line_number=23, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=9, argval='Here we go, here 
we go, here we go...', argrepr="'Here we go, here we go, here we go...'", 
offset=392, start_offset=392, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=394, start_offset=394, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=402, start_offset=402, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=404, start_offset=404, starts_line=False, line_number=23, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=53, 
argval=302, argrepr='to L11', offset=406, start_offset=406, starts_line=False, 
line_number=23, label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=0, argval=0, argrepr='', 
offset=408, start_offset=408, starts_line=True, line_number=22, label=13, 
positions=None, cache_info=None),
-  Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=410, start_offset=410, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=412, start_offset=412, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=414, start_offset=414, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=416, start_offset=416, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=418, start_offset=418, starts_line=True, 
line_number=28, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
-  Instruction(opname='LOAD_CONST', opcode=80, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=428, start_offset=428, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
-  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=430, start_offset=430, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
-  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=438, start_offset=438, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=0, argval=0, argrepr='', 
offset=440, start_offset=440, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=442, start_offset=442, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
-  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=444, start_offset=444, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
-  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=446, start_offset=446, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_JUMP_IF_TRUE', opcode=98, arg=2, argval=192, 
argrepr='to L7', offset=184, start_offset=184, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='JUMP_BACKWARD', opcode=73, arg=39, argval=114, 
argrepr='to L5', offset=188, start_offset=188, starts_line=False, 
line_number=16, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='JUMP_FORWARD', opcode=75, arg=11, argval=216, 
argrepr='to L9', offset=192, start_offset=192, starts_line=True, 
line_number=17, label=7, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=194, start_offset=194, starts_line=True, 
line_number=19, label=8, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=6, argval='Who let lolcatz 
into this test suite?', argrepr="'Who let lolcatz into this test suite?'", 
offset=204, start_offset=204, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=206, start_offset=206, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=214, start_offset=214, starts_line=False, line_number=19, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='NOP', opcode=27, arg=None, argval=None, argrepr='', 
offset=216, start_offset=216, starts_line=True, line_number=20, label=9, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=5, argval=1, argrepr='1', 
offset=218, start_offset=218, starts_line=True, line_number=21, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=7, argval=0, argrepr='0', 
offset=220, start_offset=220, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='BINARY_OP', opcode=42, arg=11, argval=11, argrepr='/', 
offset=222, start_offset=222, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=226, start_offset=226, starts_line=False, line_number=21, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='i', argrepr='i', 
offset=228, start_offset=228, starts_line=True, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='COPY', opcode=57, arg=1, argval=1, argrepr='', 
offset=230, start_offset=230, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_SPECIAL', opcode=90, arg=1, argval=1, 
argrepr='__exit__', offset=232, start_offset=232, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='SWAP', opcode=113, arg=2, argval=2, argrepr='', 
offset=234, start_offset=234, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='SWAP', opcode=113, arg=3, argval=3, argrepr='', 
offset=236, start_offset=236, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_SPECIAL', opcode=90, arg=0, argval=0, 
argrepr='__enter__', offset=238, start_offset=238, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='CALL', opcode=49, arg=0, argval=0, argrepr='', 
offset=240, start_offset=240, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='STORE_FAST', opcode=108, arg=1, argval='dodgy', 
argrepr='dodgy', offset=248, start_offset=248, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=250, start_offset=250, starts_line=True, 
line_number=26, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=8, argval='Never reach 
this', argrepr="'Never reach this'", offset=260, start_offset=260, 
starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
+  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=262, start_offset=262, starts_line=False, line_number=26, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=270, start_offset=270, starts_line=False, line_number=26, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=272, start_offset=272, starts_line=True, line_number=25, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=274, start_offset=274, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=None, 
argrepr='None', offset=276, start_offset=276, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='CALL', opcode=49, arg=3, argval=3, argrepr='', 
offset=278, start_offset=278, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=286, start_offset=286, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=288, start_offset=288, starts_line=True, 
line_number=28, label=10, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=298, start_offset=298, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=300, start_offset=300, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=308, start_offset=308, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='RETURN_CONST', opcode=101, arg=0, argval=None, 
argrepr='None', offset=310, start_offset=310, starts_line=False, 
line_number=28, label=None, positions=None, cache_info=None),
+  Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=312, start_offset=312, starts_line=True, line_number=25, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='WITH_EXCEPT_START', opcode=41, arg=None, argval=None, 
argrepr='', offset=314, start_offset=314, starts_line=False, line_number=25, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='TO_BOOL', opcode=37, arg=None, argval=None, argrepr='', 
offset=316, start_offset=316, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='POP_JUMP_IF_TRUE', opcode=98, arg=1, argval=330, 
argrepr='to L11', offset=324, start_offset=324, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='RERAISE', opcode=100, arg=2, argval=2, argrepr='', 
offset=328, start_offset=328, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=330, start_offset=330, starts_line=False, line_number=25, label=11, 
positions=None, cache_info=None),
+  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=332, start_offset=332, starts_line=False, line_number=25, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=334, start_offset=334, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=336, start_offset=336, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=338, start_offset=338, starts_line=False, line_number=25, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=27, 
argval=288, argrepr='to L10', offset=340, start_offset=340, starts_line=False, 
line_number=25, label=None, positions=None, cache_info=None),
+  Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=342, start_offset=342, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=344, start_offset=344, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=346, start_offset=346, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=348, start_offset=348, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=4, 
argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=350, 
start_offset=350, starts_line=True, line_number=22, label=None, positions=None, 
cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), 
('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, 
b'\x00\x00')]),
+  Instruction(opname='CHECK_EXC_MATCH', opcode=5, arg=None, argval=None, 
argrepr='', offset=360, start_offset=360, starts_line=False, line_number=22, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='POP_JUMP_IF_FALSE', opcode=95, arg=14, argval=394, 
argrepr='to L12', offset=362, start_offset=362, starts_line=False, 
line_number=22, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=366, start_offset=366, starts_line=False, line_number=22, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=368, start_offset=368, starts_line=True, 
line_number=23, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=9, argval='Here we go, here 
we go, here we go...', argrepr="'Here we go, here we go, here we go...'", 
offset=378, start_offset=378, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=380, start_offset=380, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=388, start_offset=388, starts_line=False, line_number=23, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=390, start_offset=390, starts_line=False, line_number=23, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=74, arg=53, 
argval=288, argrepr='to L10', offset=392, start_offset=392, starts_line=False, 
line_number=23, label=None, positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=100, arg=0, argval=0, argrepr='', 
offset=394, start_offset=394, starts_line=True, line_number=22, label=12, 
positions=None, cache_info=None),
+  Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=396, start_offset=396, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=398, start_offset=398, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=400, start_offset=400, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='PUSH_EXC_INFO', opcode=30, arg=None, argval=None, 
argrepr='', offset=402, start_offset=402, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='LOAD_GLOBAL', opcode=88, arg=3, argval='print', 
argrepr='print + NULL', offset=404, start_offset=404, starts_line=True, 
line_number=28, label=None, positions=None, cache_info=[('counter', 1, 
b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, 
b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
+  Instruction(opname='LOAD_CONST', opcode=80, arg=10, argval="OK, now we're 
done", argrepr='"OK, now we\'re done"', offset=414, start_offset=414, 
starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
+  Instruction(opname='CALL', opcode=49, arg=1, argval=1, argrepr='', 
offset=416, start_offset=416, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, 
b'\x00\x00\x00\x00')]),
+  Instruction(opname='POP_TOP', opcode=29, arg=None, argval=None, argrepr='', 
offset=424, start_offset=424, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=100, arg=0, argval=0, argrepr='', 
offset=426, start_offset=426, starts_line=False, line_number=28, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='COPY', opcode=57, arg=3, argval=3, argrepr='', 
offset=428, start_offset=428, starts_line=True, line_number=None, label=None, 
positions=None, cache_info=None),
+  Instruction(opname='POP_EXCEPT', opcode=28, arg=None, argval=None, 
argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, 
label=None, positions=None, cache_info=None),
+  Instruction(opname='RERAISE', opcode=100, arg=1, argval=1, argrepr='', 
offset=432, start_offset=432, starts_line=False, line_number=None, label=None, 
positions=None, cache_info=None),
 ]
 
 # One last piece of inspect fodder to check the default line number handling
diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py
index 8ef8c374cd6cc5..351f1067c10343 100644
--- a/Lib/test/test_monitoring.py
+++ b/Lib/test/test_monitoring.py
@@ -1446,9 +1446,27 @@ class BranchRecorder(JumpRecorder):
 
 
 
+class JumpOffsetRecorder:
+
+    event_type = E.JUMP
+    name = "jump"
+
+    def __init__(self, events, offsets=False):
+        self.events = events
+
+    def __call__(self, code, from_, to):
+        self.events.append((self.name, code.co_name, from_, to))
+
+class BranchOffsetRecorder(JumpOffsetRecorder):
+
+    event_type = E.BRANCH
+    name = "branch"
+
+
 JUMP_AND_BRANCH_RECORDERS = JumpRecorder, BranchRecorder
 JUMP_BRANCH_AND_LINE_RECORDERS = JumpRecorder, BranchRecorder, LineRecorder
 FLOW_AND_LINE_RECORDERS = JumpRecorder, BranchRecorder, LineRecorder, 
ExceptionRecorder, ReturnRecorder
+BRANCH_OFFSET_RECORDERS = BranchOffsetRecorder,
 
 class TestBranchAndJumpEvents(CheckEvents):
     maxDiff = None
@@ -1538,6 +1556,24 @@ def func():
             ('return', 'func', None),
             ('line', 'get_events', 11)])
 
+    def test_while_offset_consistency(self):
+
+        def foo(n=0):
+            while n<4:
+                pass
+                n += 1
+            return None
+
+        in_loop = ('branch', 'foo', 10, 14)
+        exit_loop = ('branch', 'foo', 10, 30)
+        self.check_events(foo, recorders = BRANCH_OFFSET_RECORDERS, expected = 
[
+            in_loop,
+            in_loop,
+            in_loop,
+            in_loop,
+            exit_loop])
+
+
 class TestLoadSuperAttr(CheckEvents):
     RECORDERS = CallRecorder, LineRecorder, CRaiseRecorder, CReturnRecorder
 
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2024-08-12-11-45-47.gh-issue-122821.WnAzTK.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2024-08-12-11-45-47.gh-issue-122821.WnAzTK.rst
new file mode 100644
index 00000000000000..4cf31054bd0ccd
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2024-08-12-11-45-47.gh-issue-122821.WnAzTK.rst
@@ -0,0 +1,3 @@
+Make sure that branches in :keyword:`while` statements have consistent offsets 
for
+:mod:`sys.monitoring`. :keyword:`!while` statements are now compiled with a 
simple
+jump at the end of the body, instead of duplicating the test.
diff --git a/Python/compile.c b/Python/compile.c
index 9695a99d201144..0efa7470da4b04 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -3051,7 +3051,6 @@ static int
 compiler_while(struct compiler *c, stmt_ty s)
 {
     NEW_JUMP_TARGET_LABEL(c, loop);
-    NEW_JUMP_TARGET_LABEL(c, body);
     NEW_JUMP_TARGET_LABEL(c, end);
     NEW_JUMP_TARGET_LABEL(c, anchor);
 
@@ -3060,9 +3059,8 @@ compiler_while(struct compiler *c, stmt_ty s)
     RETURN_IF_ERROR(compiler_push_fblock(c, LOC(s), WHILE_LOOP, loop, end, 
NULL));
     RETURN_IF_ERROR(compiler_jump_if(c, LOC(s), s->v.While.test, anchor, 0));
 
-    USE_LABEL(c, body);
     VISIT_SEQ(c, stmt, s->v.While.body);
-    RETURN_IF_ERROR(compiler_jump_if(c, LOC(s), s->v.While.test, body, 1));
+    ADDOP_JUMP(c, NO_LOCATION, JUMP, loop);
 
     compiler_pop_fblock(c, WHILE_LOOP, loop);
 

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to