summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2023-07-27 14:47:33 (GMT)
committerGitHub <noreply@github.com>2023-07-27 14:47:33 (GMT)
commitac7a0f858a8d0c6ca2e64bb880fca40e229d267a (patch)
treef9765cb1e1508018aeaa3259ef3eb431d263e6cc
parent9a7204b86bdb3e26c2a62aeaafb875275500b9f7 (diff)
downloadcpython-ac7a0f858a8d0c6ca2e64bb880fca40e229d267a.zip
cpython-ac7a0f858a8d0c6ca2e64bb880fca40e229d267a.tar.gz
cpython-ac7a0f858a8d0c6ca2e64bb880fca40e229d267a.tar.bz2
GH-106898: Add the exception as an argument to the `PY_UNWIND` event callback function. (GH-107347)
-rw-r--r--Lib/test/test_monitoring.py6
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-07-26-21-28-06.gh-issue-106898.8Wjuiv.rst3
-rw-r--r--Python/ceval.c2
-rw-r--r--Python/legacy_tracing.c24
4 files changed, 29 insertions, 6 deletions
diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py
index 7098f48..b36382c 100644
--- a/Lib/test/test_monitoring.py
+++ b/Lib/test/test_monitoring.py
@@ -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
index 0000000..f1b1c4c
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-07-26-21-28-06.gh-issue-106898.8Wjuiv.rst
@@ -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.
diff --git a/Python/ceval.c b/Python/ceval.c
index c0b37b3..17818a0 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1987,7 +1987,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);
}
diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c
index 9cc48fc..48db517 100644
--- a/Python/legacy_tracing.c
+++ b/Python/legacy_tracing.c
@@ -65,6 +65,16 @@ sys_profile_func3(
}
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,
size_t nargsf, PyObject *kwnames
@@ -153,6 +163,16 @@ sys_trace_func2(
}
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,
size_t nargsf, PyObject *kwnames
@@ -362,7 +382,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;
}
@@ -450,7 +470,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;
}