https://github.com/python/cpython/commit/0d9148823dbb6af020945ab1b487d7f183b561a5
commit: 0d9148823dbb6af020945ab1b487d7f183b561a5
branch: main
author: Tian Gao <gaogaotiant...@hotmail.com>
committer: gvanrossum <gvanros...@gmail.com>
date: 2024-05-06T21:22:59-07:00
summary:

gh-118414: Fix assertion in YIELD_VALUE when tracing lines or instrs (#118683)

files:
A Misc/NEWS.d/next/Core and 
Builtins/2024-05-07-01-39-24.gh-issue-118414.G5GG7l.rst
M Lib/test/test_monitoring.py
M Python/bytecodes.c
M Python/executor_cases.c.h
M Python/generated_cases.c.h

diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py
index eeb3f88a081750..6974bc5517ae5f 100644
--- a/Lib/test/test_monitoring.py
+++ b/Lib/test/test_monitoring.py
@@ -656,6 +656,17 @@ def func2():
 
         self.check_lines(func2, [1,2,3,4,5,6])
 
+    def test_generator_with_line(self):
+
+        def f():
+            def a():
+                yield
+            def b():
+                yield from a()
+            next(b())
+
+        self.check_lines(f, [1,3,5,4,2,4])
+
 class TestDisable(MonitoringTestBase, unittest.TestCase):
 
     def gen(self, cond):
diff --git a/Misc/NEWS.d/next/Core and 
Builtins/2024-05-07-01-39-24.gh-issue-118414.G5GG7l.rst b/Misc/NEWS.d/next/Core 
and Builtins/2024-05-07-01-39-24.gh-issue-118414.G5GG7l.rst
new file mode 100644
index 00000000000000..cd545049f92693
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and 
Builtins/2024-05-07-01-39-24.gh-issue-118414.G5GG7l.rst 
@@ -0,0 +1 @@
+Add instrumented opcodes to YIELD_VALUE assertion for tracing cases.
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index b2ddec98e682f2..55eda9711dea1f 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1121,7 +1121,9 @@ dummy_func(
             /* We don't know which of these is relevant here, so keep them 
equal */
             assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
             #if TIER_ONE
-            assert(_PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
+            assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
+                   frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
+                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == 
INTERPRETER_EXIT ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == 
ENTER_EXECUTOR);
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 5f15f67324292b..347a1e677a0832 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -1137,7 +1137,9 @@
             /* We don't know which of these is relevant here, so keep them 
equal */
             assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
             #if TIER_ONE
-            assert(_PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
+            assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
+                   frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
+                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == 
INTERPRETER_EXIT ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == 
ENTER_EXECUTOR);
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index d3126b0c980723..8b8112209cc78a 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -6223,7 +6223,9 @@
             /* We don't know which of these is relevant here, so keep them 
equal */
             assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
             #if TIER_ONE
-            assert(_PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
+            assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
+                   frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
+                   _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == 
INTERPRETER_EXIT ||
                    _PyOpcode_Deopt[frame->instr_ptr->op.code] == 
ENTER_EXECUTOR);

_______________________________________________
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