]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-134879: Fix `INSTRUMENT_FOR_ITER` for list/tuple (#134897)
authorMark Shannon <mark@hotpy.org>
Fri, 30 May 2025 14:11:42 +0000 (15:11 +0100)
committerGitHub <noreply@github.com>
Fri, 30 May 2025 14:11:42 +0000 (07:11 -0700)
Fix INSTRUMENT_FOR_ITER for list/tuple

Lib/test/test_monitoring.py
Python/bytecodes.c
Python/generated_cases.c.h

index 263e4e6f39415574c586049ac28476820372d0d8..a932ac80117d271801120cbe22788292b72ffc6a 100644 (file)
@@ -2157,6 +2157,21 @@ class TestRegressions(MonitoringTestBase, unittest.TestCase):
         sys.monitoring.restart_events()
         sys.monitoring.set_events(0, 0)
 
+    def test_134879(self):
+        # gh-134789
+        # Specialized FOR_ITER not incrementing index
+        def foo():
+            t = 0
+            for i in [1,2,3,4]:
+                t += i
+            self.assertEqual(t, 10)
+
+        sys.monitoring.use_tool_id(0, "test")
+        self.addCleanup(sys.monitoring.free_tool_id, 0)
+        sys.monitoring.set_local_events(0, foo.__code__, E.BRANCH_LEFT | E.BRANCH_RIGHT)
+        foo()
+        sys.monitoring.set_local_events(0, foo.__code__, 0)
+
 
 class TestOptimizer(MonitoringTestBase, unittest.TestCase):
 
index a1f8d3605283e3894ef16971e88f233173dc2a19..f02e32fd1d312aea075397760d871bf278c2d9b3 100644 (file)
@@ -3130,7 +3130,6 @@ dummy_func(
             if (PyStackRef_IsTaggedInt(null_or_index)) {
                 next = _PyForIter_NextWithIndex(iter_o, null_or_index);
                 if (PyStackRef_IsNull(next)) {
-                    null_or_index = PyStackRef_TagInt(-1);
                     JUMPBY(oparg + 1);
                     DISPATCH();
                 }
@@ -3191,6 +3190,7 @@ dummy_func(
                     JUMPBY(oparg + 1);
                     DISPATCH();
                 }
+                null_or_index = PyStackRef_IncrementTaggedIntNoOverflow(null_or_index);
                 INSTRUMENTED_JUMP(this_instr, next_instr, PY_MONITORING_EVENT_BRANCH_LEFT);
             }
             else {
index 5be2671700aee77d9b5a7a7c65fb076377465a4c..e3cd3b71a1de08d107c8ad46e55eb502cd63e85f 100644 (file)
                     next = _PyForIter_NextWithIndex(iter_o, null_or_index);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
                     if (PyStackRef_IsNull(next)) {
-                        null_or_index = PyStackRef_TagInt(-1);
                         JUMPBY(oparg + 1);
-                        stack_pointer[-1] = null_or_index;
                         DISPATCH();
                     }
                     null_or_index = PyStackRef_IncrementTaggedIntNoOverflow(null_or_index);
                     JUMPBY(oparg + 1);
                     DISPATCH();
                 }
+                null_or_index = PyStackRef_IncrementTaggedIntNoOverflow(null_or_index);
                 INSTRUMENTED_JUMP(this_instr, next_instr, PY_MONITORING_EVENT_BRANCH_LEFT);
             }
             else {
                     DISPATCH();
                 }
             }
+            stack_pointer[-1] = null_or_index;
             stack_pointer[0] = next;
             stack_pointer += 1;
             assert(WITHIN_STACK_BOUNDS());