[Python-checkins] [3.10] GH-96864: Check for error between line and opcode events (GH-96969)

brandtbucher webhook-mailer at python.org
Tue Sep 20 14:42:19 EDT 2022


https://github.com/python/cpython/commit/21b5af9072a43275d52737a68d5cda2fab47f730
commit: 21b5af9072a43275d52737a68d5cda2fab47f730
branch: 3.10
author: Brandt Bucher <brandtbucher at microsoft.com>
committer: brandtbucher <brandtbucher at gmail.com>
date: 2022-09-20T11:42:06-07:00
summary:

[3.10] GH-96864: Check for error between line and opcode events (GH-96969)

(cherry picked from commit c10e33ac119d96c4d88d5ae8b59e65a76ae0ad3c)

files:
A Misc/NEWS.d/next/Core and Builtins/2022-09-16-12-36-13.gh-issue-96864.PLU3i8.rst
M Lib/test/test_sys_settrace.py
M Python/ceval.c

diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py
index 1f509eee556b..312b909426ee 100644
--- a/Lib/test/test_sys_settrace.py
+++ b/Lib/test/test_sys_settrace.py
@@ -1310,6 +1310,20 @@ def g(frame, event, arg):
         finally:
             sys.settrace(existing)
 
+    def test_line_event_raises_before_opcode_event(self):
+        exception = ValueError("BOOM!")
+        def trace(frame, event, arg):
+            if event == "line":
+                raise exception
+            frame.f_trace_opcodes = True
+            return trace
+        def f():
+            pass
+        with self.assertRaises(ValueError) as caught:
+            sys.settrace(trace)
+            f()
+        self.assertIs(caught.exception, exception)
+
 
 # 'Jump' tests: assigning to frame.f_lineno within a trace function
 # moves the execution position - it's how debuggers implement a Jump
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-09-16-12-36-13.gh-issue-96864.PLU3i8.rst b/Misc/NEWS.d/next/Core and Builtins/2022-09-16-12-36-13.gh-issue-96864.PLU3i8.rst
new file mode 100644
index 000000000000..c0d41ae7d21e
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-09-16-12-36-13.gh-issue-96864.PLU3i8.rst	
@@ -0,0 +1,2 @@
+Fix a possible assertion failure, fatal error, or :exc:`SystemError` if a
+line tracing event raises an exception while opcode tracing is enabled.
diff --git a/Python/ceval.c b/Python/ceval.c
index df4b9a84a2de..9719177e19ba 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5512,7 +5512,7 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
         }
     }
     /* Always emit an opcode event if we're tracing all opcodes. */
-    if (frame->f_trace_opcodes) {
+    if (frame->f_trace_opcodes && result == 0) {
         result = call_trace(func, obj, tstate, frame, trace_info, PyTrace_OPCODE, Py_None);
     }
     return result;



More information about the Python-checkins mailing list