aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/legacy_tracing.c
diff options
context:
space:
mode:
authorTian Gao <gaogaotiantian@hotmail.com>2023-11-02 09:38:08 -0700
committerGitHub <noreply@github.com>2023-11-02 16:38:08 +0000
commitf4b5588bde656d8ad048b66a0be4cb5131f0d83f (patch)
treee20b821a20edafecc42165bb1c94951a48cce7c0 /Python/legacy_tracing.c
parent0887b9ce8b5b4f9ecdef014b9329da78a46c9f42 (diff)
downloadcpython-f4b5588bde656d8ad048b66a0be4cb5131f0d83f.tar.gz
cpython-f4b5588bde656d8ad048b66a0be4cb5131f0d83f.zip
gh-110892: Return NULL for `PyTrace_RETURN` events caused by an exception (GH-110909)
Diffstat (limited to 'Python/legacy_tracing.c')
-rw-r--r--Python/legacy_tracing.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c
index 97d39a14ae4..ddc727113af 100644
--- a/Python/legacy_tracing.c
+++ b/Python/legacy_tracing.c
@@ -46,7 +46,7 @@ call_profile_func(_PyLegacyEventHandler *self, PyObject *arg)
}
static PyObject *
-sys_profile_func2(
+sys_profile_start(
_PyLegacyEventHandler *self, PyObject *const *args,
size_t nargsf, PyObject *kwnames
) {
@@ -56,7 +56,17 @@ sys_profile_func2(
}
static PyObject *
-sys_profile_func3(
+sys_profile_throw(
+ _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_return(
_PyLegacyEventHandler *self, PyObject *const *args,
size_t nargsf, PyObject *kwnames
) {
@@ -72,7 +82,7 @@ sys_profile_unwind(
) {
assert(kwnames == NULL);
assert(PyVectorcall_NARGS(nargsf) == 3);
- return call_profile_func(self, Py_None);
+ return call_profile_func(self, NULL);
}
static PyObject *
@@ -154,7 +164,7 @@ sys_trace_exception_func(
}
static PyObject *
-sys_trace_func2(
+sys_trace_start(
_PyLegacyEventHandler *self, PyObject *const *args,
size_t nargsf, PyObject *kwnames
) {
@@ -164,7 +174,7 @@ sys_trace_func2(
}
static PyObject *
-sys_trace_func3(
+sys_trace_throw(
_PyLegacyEventHandler *self, PyObject *const *args,
size_t nargsf, PyObject *kwnames
) {
@@ -174,6 +184,16 @@ sys_trace_func3(
}
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, NULL);
+}
+
+static PyObject *
sys_trace_return(
_PyLegacyEventHandler *self, PyObject *const *args,
size_t nargsf, PyObject *kwnames
@@ -373,17 +393,17 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
if (!tstate->interp->sys_profile_initialized) {
tstate->interp->sys_profile_initialized = true;
if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID,
- (vectorcallfunc)sys_profile_func2, PyTrace_CALL,
+ (vectorcallfunc)sys_profile_start, PyTrace_CALL,
PY_MONITORING_EVENT_PY_START, PY_MONITORING_EVENT_PY_RESUME)) {
return -1;
}
if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID,
- (vectorcallfunc)sys_profile_func3, PyTrace_CALL,
+ (vectorcallfunc)sys_profile_throw, PyTrace_CALL,
PY_MONITORING_EVENT_PY_THROW, -1)) {
return -1;
}
if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID,
- (vectorcallfunc)sys_profile_func3, PyTrace_RETURN,
+ (vectorcallfunc)sys_profile_return, PyTrace_RETURN,
PY_MONITORING_EVENT_PY_RETURN, PY_MONITORING_EVENT_PY_YIELD)) {
return -1;
}
@@ -447,12 +467,12 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
if (!tstate->interp->sys_trace_initialized) {
tstate->interp->sys_trace_initialized = true;
if (set_callbacks(PY_MONITORING_SYS_TRACE_ID,
- (vectorcallfunc)sys_trace_func2, PyTrace_CALL,
+ (vectorcallfunc)sys_trace_start, PyTrace_CALL,
PY_MONITORING_EVENT_PY_START, PY_MONITORING_EVENT_PY_RESUME)) {
return -1;
}
if (set_callbacks(PY_MONITORING_SYS_TRACE_ID,
- (vectorcallfunc)sys_trace_func3, PyTrace_CALL,
+ (vectorcallfunc)sys_trace_throw, PyTrace_CALL,
PY_MONITORING_EVENT_PY_THROW, -1)) {
return -1;
}
@@ -477,7 +497,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
return -1;
}
if (set_callbacks(PY_MONITORING_SYS_TRACE_ID,
- (vectorcallfunc)sys_trace_func3, PyTrace_RETURN,
+ (vectorcallfunc)sys_trace_unwind, PyTrace_RETURN,
PY_MONITORING_EVENT_PY_UNWIND, -1)) {
return -1;
}