Skip to content

Commit ffb44cd

Browse files
[3.13] gh-126425: Refactor _lsprof_Profiler_enable (GH-126426) (#126442)
gh-126425: Refactor `_lsprof_Profiler_enable` (GH-126426) - Explicit memory management for `None` objects (since we still try to treat immortal objects as regular objects) - Respect possible errors of `sys.monitoring.register_callback` call (cherry picked from commit 7587260) Co-authored-by: sobolevn <mail@sobolevn.me>
1 parent c1e708a commit ffb44cd

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

Modules/_lsprof.c

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -754,34 +754,47 @@ profiler_enable(ProfilerObject *self, PyObject *args, PyObject *kwds)
754754
return NULL;
755755
}
756756

757-
if (PyObject_CallMethod(monitoring, "use_tool_id", "is", self->tool_id, "cProfile") == NULL) {
757+
PyObject *check = PyObject_CallMethod(monitoring,
758+
"use_tool_id", "is",
759+
self->tool_id, "cProfile");
760+
if (check == NULL) {
758761
PyErr_Format(PyExc_ValueError, "Another profiling tool is already active");
759-
Py_DECREF(monitoring);
760-
return NULL;
762+
goto error;
761763
}
764+
Py_DECREF(check);
762765

763766
for (int i = 0; callback_table[i].callback_method; i++) {
767+
int event = (1 << callback_table[i].event);
764768
PyObject* callback = PyObject_GetAttrString((PyObject*)self, callback_table[i].callback_method);
765769
if (!callback) {
766-
Py_DECREF(monitoring);
767-
return NULL;
770+
goto error;
768771
}
769-
Py_XDECREF(PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id,
770-
(1 << callback_table[i].event),
771-
callback));
772+
PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback",
773+
"iiO", self->tool_id,
774+
event, callback);
772775
Py_DECREF(callback);
773-
all_events |= (1 << callback_table[i].event);
776+
if (register_result == NULL) {
777+
goto error;
778+
}
779+
Py_DECREF(register_result);
780+
all_events |= event;
774781
}
775782

776-
if (!PyObject_CallMethod(monitoring, "set_events", "ii", self->tool_id, all_events)) {
777-
Py_DECREF(monitoring);
778-
return NULL;
783+
PyObject *event_result = PyObject_CallMethod(monitoring, "set_events", "ii",
784+
self->tool_id, all_events);
785+
if (event_result == NULL) {
786+
goto error;
779787
}
780788

789+
Py_DECREF(event_result);
781790
Py_DECREF(monitoring);
782791

783792
self->flags |= POF_ENABLED;
784793
Py_RETURN_NONE;
794+
795+
error:
796+
Py_DECREF(monitoring);
797+
return NULL;
785798
}
786799

787800
static void

0 commit comments

Comments
 (0)