]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] GH-106898: Add the exception as an argument to the `PY_UNWIND` event callback...
authorMark Shannon <mark@hotpy.org>
Fri, 28 Jul 2023 10:30:16 +0000 (11:30 +0100)
committerGitHub <noreply@github.com>
Fri, 28 Jul 2023 10:30:16 +0000 (11:30 +0100)
Lib/test/test_monitoring.py
Misc/NEWS.d/next/Core and Builtins/2023-07-26-21-28-06.gh-issue-106898.8Wjuiv.rst [new file with mode: 0644]
Python/ceval.c
Python/legacy_tracing.c

index 9685a43810136c40eaad2e4d50a2c80a87455f2b..9d0ad6fa834bc739a711cac368bb672b862cae74 100644 (file)
@@ -715,7 +715,7 @@ class CheckEvents(MonitoringTestBase, unittest.TestCase):
             self.assertIn(r0, ("raise", "reraise"))
             h0 = h[0]
             self.assertIn(h0, ("handled", "unwind"))
-
+            self.assertEqual(r[1], h[1])
 
 
 class StopiterationRecorder(ExceptionRecorder):
@@ -733,8 +733,8 @@ class UnwindRecorder(ExceptionRecorder):
 
     event_type = E.PY_UNWIND
 
-    def __call__(self, *args):
-        self.events.append(("unwind", None))
+    def __call__(self, code, offset, exc):
+        self.events.append(("unwind", type(exc)))
 
 class ExceptionHandledRecorder(ExceptionRecorder):
 
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-07-26-21-28-06.gh-issue-106898.8Wjuiv.rst b/Misc/NEWS.d/next/Core and Builtins/2023-07-26-21-28-06.gh-issue-106898.8Wjuiv.rst
new file mode 100644 (file)
index 0000000..f1b1c4c
--- /dev/null
@@ -0,0 +1,3 @@
+Add the exception as the third argument to ``PY_UNIND`` callbacks in
+``sys.monitoring``. This makes the ``PY_UNWIND`` callback consistent with
+the other exception hanlding callbacks.
index 27dea27e81200963d769e30bc8f6c514714be8df..494742061621308c6defa9969edddad432a082dd 100644 (file)
@@ -2070,7 +2070,7 @@ monitor_unwind(PyThreadState *tstate,
     if (no_tools_for_event(tstate, frame, PY_MONITORING_EVENT_PY_UNWIND)) {
         return;
     }
-    _Py_call_instrumentation_exc0(tstate, PY_MONITORING_EVENT_PY_UNWIND, frame, instr);
+    do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_PY_UNWIND);
 }
 
 
index 5143b79b0864d80d5a536856c8847b3826de2d29..c1c70f667ccd29c81415e551acd93f4df0dc9c90 100644 (file)
@@ -64,6 +64,16 @@ sys_profile_func3(
     return call_profile_func(self, args[2]);
 }
 
+static PyObject *
+sys_profile_unwind(
+    _PyLegacyEventHandler *self, PyObject *const *args,
+    size_t nargsf, PyObject *kwnames
+) {
+    assert(kwnames == NULL);
+    assert(PyVectorcall_NARGS(nargsf) == 3);
+    return call_profile_func(self, Py_None);
+}
+
 static PyObject *
 sys_profile_call_or_return(
     _PyLegacyEventHandler *self, PyObject *const *args,
@@ -152,6 +162,16 @@ sys_trace_func2(
     return call_trace_func(self, Py_None);
 }
 
+static PyObject *
+sys_trace_unwind(
+    _PyLegacyEventHandler *self, PyObject *const *args,
+    size_t nargsf, PyObject *kwnames
+) {
+    assert(kwnames == NULL);
+    assert(PyVectorcall_NARGS(nargsf) == 3);
+    return call_trace_func(self, Py_None);
+}
+
 static PyObject *
 sys_trace_return(
     _PyLegacyEventHandler *self, PyObject *const *args,
@@ -363,7 +383,7 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
             return -1;
         }
         if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID,
-            (vectorcallfunc)sys_profile_func2, PyTrace_RETURN,
+            (vectorcallfunc)sys_profile_unwind, PyTrace_RETURN,
                         PY_MONITORING_EVENT_PY_UNWIND, -1)) {
             return -1;
         }
@@ -451,7 +471,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
             return -1;
         }
         if (set_callbacks(PY_MONITORING_SYS_TRACE_ID,
-            (vectorcallfunc)sys_trace_func2, PyTrace_RETURN,
+            (vectorcallfunc)sys_trace_unwind, PyTrace_RETURN,
                         PY_MONITORING_EVENT_PY_UNWIND, -1)) {
             return -1;
         }