From 4a98ae83a82ce820266122639d084230db1fbcb1 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Tue, 5 Nov 2024 10:13:41 +0300 Subject: [PATCH 1/3] gh-126425: Refactor `_lsprof_Profiler_enable` --- Modules/_lsprof.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 4f996c7230e16d..27e80e5caecfa3 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -780,34 +780,47 @@ _lsprof_Profiler_enable_impl(ProfilerObject *self, int subcalls, return NULL; } - if (PyObject_CallMethod(monitoring, "use_tool_id", "is", self->tool_id, "cProfile") == NULL) { + PyObject *check = PyObject_CallMethod(monitoring, + "use_tool_id", "is", + self->tool_id, "cProfile"); + if (check == NULL) { + PyErr_Clear(); PyErr_Format(PyExc_ValueError, "Another profiling tool is already active"); - Py_DECREF(monitoring); - return NULL; + goto error; } + Py_DECREF(check); for (int i = 0; callback_table[i].callback_method; i++) { + int event = (1 << callback_table[i].event); PyObject* callback = PyObject_GetAttrString((PyObject*)self, callback_table[i].callback_method); if (!callback) { - Py_DECREF(monitoring); - return NULL; + goto error; + } + PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback", + "iiO", self->tool_id, + event, callback); + Py_DECREF(callback); // register_result is callback + if (register_result == NULL) { + goto error; } - Py_XDECREF(PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id, - (1 << callback_table[i].event), - callback)); - Py_DECREF(callback); - all_events |= (1 << callback_table[i].event); + all_events |= event; } - if (!PyObject_CallMethod(monitoring, "set_events", "ii", self->tool_id, all_events)) { - Py_DECREF(monitoring); - return NULL; + PyObject *event_result = PyObject_CallMethod(monitoring, "set_events", "ii", + self->tool_id, all_events); + if (event_result == NULL) { + goto error; } + Py_DECREF(event_result); Py_DECREF(monitoring); self->flags |= POF_ENABLED; Py_RETURN_NONE; + +error: + Py_DECREF(monitoring); + return NULL; } static void From 07b4b4259b2f6ae62c2fd53c80ae30f17cd4b937 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Tue, 5 Nov 2024 13:27:03 +0300 Subject: [PATCH 2/3] Address review --- Modules/_lsprof.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 27e80e5caecfa3..2c420bfa8c47a8 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -799,7 +799,8 @@ _lsprof_Profiler_enable_impl(ProfilerObject *self, int subcalls, PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id, event, callback); - Py_DECREF(callback); // register_result is callback + Py_DECREF(register_result); + Py_DECREF(callback); if (register_result == NULL) { goto error; } From a396d59209304e836506c0c9d1e9c7dc3bcc28b2 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Tue, 5 Nov 2024 14:47:52 +0300 Subject: [PATCH 3/3] Address review --- Modules/_lsprof.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 2c420bfa8c47a8..51ad9fc7da8492 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -784,7 +784,6 @@ _lsprof_Profiler_enable_impl(ProfilerObject *self, int subcalls, "use_tool_id", "is", self->tool_id, "cProfile"); if (check == NULL) { - PyErr_Clear(); PyErr_Format(PyExc_ValueError, "Another profiling tool is already active"); goto error; } @@ -799,11 +798,11 @@ _lsprof_Profiler_enable_impl(ProfilerObject *self, int subcalls, PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id, event, callback); - Py_DECREF(register_result); Py_DECREF(callback); if (register_result == NULL) { goto error; } + Py_DECREF(register_result); all_events |= event; }