Skip to content

Commit 786886a

Browse files
[3.12] gh-126425: Refactor _lsprof_Profiler_enable (GH-126426) (#126443)
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 <[email protected]>
1 parent 47d48b6 commit 786886a

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

Modules/_lsprof.c

+25-12
Original file line numberDiff line numberDiff line change
@@ -750,34 +750,47 @@ profiler_enable(ProfilerObject *self, PyObject *args, PyObject *kwds)
750750
return NULL;
751751
}
752752

753-
if (PyObject_CallMethod(monitoring, "use_tool_id", "is", self->tool_id, "cProfile") == NULL) {
753+
PyObject *check = PyObject_CallMethod(monitoring,
754+
"use_tool_id", "is",
755+
self->tool_id, "cProfile");
756+
if (check == NULL) {
754757
PyErr_Format(PyExc_ValueError, "Another profiling tool is already active");
755-
Py_DECREF(monitoring);
756-
return NULL;
758+
goto error;
757759
}
760+
Py_DECREF(check);
758761

759762
for (int i = 0; callback_table[i].callback_method; i++) {
763+
int event = (1 << callback_table[i].event);
760764
PyObject* callback = PyObject_GetAttrString((PyObject*)self, callback_table[i].callback_method);
761765
if (!callback) {
762-
Py_DECREF(monitoring);
763-
return NULL;
766+
goto error;
764767
}
765-
Py_XDECREF(PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id,
766-
(1 << callback_table[i].event),
767-
callback));
768+
PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback",
769+
"iiO", self->tool_id,
770+
event, callback);
768771
Py_DECREF(callback);
769-
all_events |= (1 << callback_table[i].event);
772+
if (register_result == NULL) {
773+
goto error;
774+
}
775+
Py_DECREF(register_result);
776+
all_events |= event;
770777
}
771778

772-
if (!PyObject_CallMethod(monitoring, "set_events", "ii", self->tool_id, all_events)) {
773-
Py_DECREF(monitoring);
774-
return NULL;
779+
PyObject *event_result = PyObject_CallMethod(monitoring, "set_events", "ii",
780+
self->tool_id, all_events);
781+
if (event_result == NULL) {
782+
goto error;
775783
}
776784

785+
Py_DECREF(event_result);
777786
Py_DECREF(monitoring);
778787

779788
self->flags |= POF_ENABLED;
780789
Py_RETURN_NONE;
790+
791+
error:
792+
Py_DECREF(monitoring);
793+
return NULL;
781794
}
782795

783796
static void

0 commit comments

Comments
 (0)