https://github.com/python/cpython/commit/75872605aa78dbdfc5c4f025b0f90a7f37ba10c3
commit: 75872605aa78dbdfc5c4f025b0f90a7f37ba10c3
branch: main
author: sobolevn <[email protected]>
committer: sobolevn <[email protected]>
date: 2024-11-05T15:23:24+03:00
summary:
gh-126425: Refactor `_lsprof_Profiler_enable` (#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
files:
M Modules/_lsprof.c
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c
index 4f996c7230e16d..51ad9fc7da8492 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_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;
}
- Py_XDECREF(PyObject_CallMethod(monitoring, "register_callback", "iiO",
self->tool_id,
- (1 << callback_table[i].event),
- callback));
+ PyObject *register_result = PyObject_CallMethod(monitoring,
"register_callback",
+ "iiO", self->tool_id,
+ event, callback);
Py_DECREF(callback);
- all_events |= (1 << callback_table[i].event);
+ if (register_result == NULL) {
+ goto error;
+ }
+ Py_DECREF(register_result);
+ 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
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]